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
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
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/guide/view/guide_main_window.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, '9c98apAG71O57m0Zpx7osfE', 'guide_main_window');
// Scripts/mod/guide/view/guide_main_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     这里是描述这个窗体的作用的
// <br/>Create: 2019-04-18 10:16:14
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var GuideConst = require("guide_const");
 
var GuideEvent = require("guide_event"); // stopAllActions
 
 
var Guide_mainWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("drama", "guide_main_view");
    this.viewTag = SCENE_TAG.msg; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
    // this.win_type   = WinType.Full;                  //是否是全屏窗体  WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
 
    this.ctrl = arguments[0];
    this.model = this.ctrl.getModel();
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initConfig: function initConfig() {
    this.adjust_guide_timer = null;
    this.timer_hander = null;
    this.time_num = 0; // 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) || {};             
  },
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {
    cc.log("99999999999999999999");
    if (game.views_js) game.views_js.cancelTouch();
    this.root_wg = this.root_wnd.getComponent(cc.Widget);
 
    if (window.FIT_SCALE > 1) {
      this.root_wg.isAlignTop = true;
      this.root_wg.isAlignBottom = true;
    }
 
    this.background_nd = this.seekChild("background");
    this.clip_con_nd = this.seekChild("clip_con");
    this.clip_mask_nd = this.seekChild("clip_mask");
    this.skip_btn_nd = this.seekChild("skip_btn");
    this.skip_btn_wd = this.skip_btn_nd.getComponent(cc.Widget);
 
    if (USE_SDK == true && (PLATFORM_TYPR == "WX_SDK" || PLATFORM_TYPR == "SH_SDK" || PLATFORM_TYPR == "QQ_SDK")) {
      this.skip_btn_wd.top = 150;
    }
 
    this.effect_con_nd = this.seekChild("effect_con");
    this.background_bi = this.seekChild("background", cc.BlockInputEvents);
    this.background_bi.enabled = true;
    this.effect_con_sk = this.seekChild("effect_con", sp.Skeleton); // 表现层信息
 
    this.guide_clip_nd = this.seekChild("guide_clip");
    this.clip_mask_bl = this.seekChild("guide_clip", cc.BlockInputEvents);
    this.guide_mask_nd = this.seekChild("guide_mask");
    this.guide_mask_nd.width = this.guide_mask_nd.width * window.FIT_SCALE; // msg
 
    this.msg_bg_nd = this.seekChild("msg_bg");
    this.msg_txt_nd = this.seekChild("msg_txt");
    this.msg_txt_rt = this.seekChild("msg_txt", cc.RichText);
    this.mas_con_nd = this.seekChild("mas_con"); // this.adjust_guide_timer = this.startUpdate(10, this.adjustGuide.bind(this), 500);
    // this.background_nd.scale = FIT_SCALE;
 
    this.clip_mask_nd.on(cc.Node.EventType.TOUCH_END, this.onClickMaskBg, this);
    this.skip_btn_nd.on(cc.Node.EventType.TOUCH_END, this.onClickSkipBtn, this); // if (this.act_config)
    //     this.addGuid(this.act_config);
  },
  openCacheView: function openCacheView() {},
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    // 断线之后的处理
    this.re_link_game_event = gcore.GlobalEvent.bind(EventId.EVT_RE_LINK_GAME, function () {
      if (this.background_bi.enabled) this.background_bi.enabled = false;
    }.bind(this));
    gcore.GlobalEvent.bind(gcore.GlobalEvent.EVT_SOCKET_DISCONNECT, function () {
      this.disconnect();
    }.bind(this));
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd(params) {
    cc.log("99999999999999999");
 
    if (this.act_config) {
      cc.log("2222222");
      this.playGuide(this.act_config);
    }
  },
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {},
  addGuid: function addGuid(guide_cfg) {
    cc.log("4444");
    this.act_config = guide_cfg;
 
    if (this.root_wnd) {
      cc.log("555");
      this.playGuide(guide_cfg);
    }
  },
  playGuide: function playGuide(config) {
    if (game.views_js && !this.root_wnd) {
      game.views_js.forBidTouch();
    }
 
    gcore.GlobalEvent.fire(GuideEvent.NewPlayerGuideStart);
    cc.log("当前正在执行的引导配置表");
    cc.log(config);
    this.config = config;
    if (!config) return;
    this.background_bi.enabled = true;
    this.act_list = Utils.deepCopy(config.act);
    this.cur_zone_list = {};
    this.need_save = false;
    this.guide_step = 0;
    this.guide_cache_data = {}; // this.guide_cache_data = RoleEnv:getInstance():get(RoleEnv.keys.guide_step_list, {})
 
    this.playNextGuide();
    this.showSkipBtn();
  },
  checkDoNextGuide: function checkDoNextGuide() {
    if (this.target) {// self.target:setTouchEnabled(false)
    }
 
    this.saveGuideStep(); // this.setSwallowTouches(true)
    // self.rect = null;
    // 关闭所有窗体
 
    this.background_bi.enabled = true;
 
    if (this.close_all) {
      Utils.closeAllWindow();
    }
 
    if (!this.need_save) {
      this.readyDoNextGuide();
    } else {
      if (!this.act_config) {
        this.endPlayGuide();
        return;
      }
 
      this.ctrl.send11121(this.act_config.id, this.guide_step);
    }
  },
  doNextGuideFromServer: function doNextGuideFromServer(id, step) {
    if (!this.act_config) return;
    if (this.act_config.id != id || this.guide_step != step) return;
    this.readyDoNextGuide();
  },
  readyDoNextGuide: function readyDoNextGuide() {
    cc.log("准备执行下一步的操作"); // if (this.notice_container && not tolua.isnull(this.notice_container)) {
    //     this.notice_container.setVisible(false);
    // }
    // if (this.backgroundLayer && not tolua.isnull(this.backgroundLayer)) {
    //     this.backgroundLayer.setVisible(false);
    // }
    // if (this.clipNode && not tolua.isnull(this.clipNode)) {
    //     this.clipNode.setVisible(false);
    // }
    // if (this.guide_effect && not tolua.isnull(this.guide_effect)) {
    //     doStopAllActions(this.guide_effect);
    //     this.guide_effect.setVisible(false);
    // }
    // if (this.guide_tips_bg && not tolua.isnull(this.guide_tips_bg)) {
    //     this.guide_tips_bg.setVisible(false);
    // }
    // if (this.txt_tips && not tolua.isnull(this.txt_tips)) {
    //     this.txt_tips.setVisible(false);
    // }
    // if (this.target && not tolua.isnull(this.target) && this.target.clearGuideListener) {
    //     this.target.clearGuideListener()
    // }
    // if (this.target)
    //     this.target.off();
 
    this.hideSKipBtn();
    if (this.guide_clip_nd.active) this.guide_clip_nd.active = false;
    if (this.clip_con_nd.active) this.clip_con_nd.active = false;
    if (this.effect_con_nd.active) this.effect_con_nd.active = false; // this.background_bi.enabled = true;
 
    if (!this.clip_mask_bl.enabled) this.clip_mask_bl.enabled = true;
    if (this.mas_con_nd.active) this.mas_con_nd.active = false;
    this.target = null;
 
    if (this.delay == 0) {
      this.playNextGuide();
    } else {
      this.delayPlayNextGuide(this.delay);
    }
  },
  delayPlayNextGuide: function delayPlayNextGuide(delay_time) {
    if (this.hasTicket("delayPlayNextGuide")) {
      this.delTicker("delayPlayNextGuide");
    }
 
    this.addTicket(this.playNextGuide.bind(this), delay_time, "delayPlayNextGuide");
  },
  playNextGuide: function playNextGuide() {
    this.saveGuideStep();
    this.clearTargetInfo();
 
    if (!this.act_list || this.act_list.length == 0) {
      this.endPlayGuide();
    } else {
      this.target_data = this.act_list.shift();
      this.guide_step = this.guide_step + 1;
      cc.log("当前步骤的数据");
      cc.log(this.target_data); // 判断当前步骤是否已经做过了,
 
      if (this.guide_cache_data[this.act_config.id] && this.guide_cache_data[this.act_config.id][this.guide_step] && !this.cur_zone_list[this.guide_step]) {
        this.playNextGuide();
      } else {
        if (this.target_data) {
          var first_act = this.target_data[0];
 
          switch (first_act) {
            case "checkstatus":
              {
                this.findRootWndByParams4();
              }
              break;
 
            case "openview":
              {
                this.findRootWndByParams3();
              }
              break;
 
            case "conditonstatus":
              {
                this.findRootWndByCondition();
              }
              break;
 
            case "emptystep":
              {
                this.playNextGuide();
              }
              break;
 
            default:
              {
                if (this.target_data.length == 2) {
                  this.findRootWndByParams2();
                } else {
                  this.findTargetByParams();
                }
              }
          } // 超过5秒就出现跳过引导
          // this.addSkipTimeTicket()
 
 
          this.showSkipBtn();
        }
      }
    }
  },
  addSkipTimeTicket: function addSkipTimeTicket() {},
  findRootWndByCondition: function findRootWndByCondition() {
    if (!this.target_data || !this.target_data[3]) return;
    var root_name = this.target_data[1];
    this.delay = this.target_data[2];
    var root_wnd = null;
 
    if (root_name == "partner") {
      var HeroController = require("hero_controller");
 
      root_wnd = HeroController.getInstance().getHeroBagRoot(this.getFinishCB.bind(this));
    } else if (root_name == "battletopscene") {
      var BattleController = require("battle_controller");
 
      root_wnd = BattleDramaController.getInstance().getDramaFightUI(this.getFinishCB.bind(this));
    } else if (root_name == "battlesceneview") {
      var BattleController = require("battle_controller");
 
      root_wnd = BattleController.getInstance().getCtrlBattleScene(this.getFinishCB.bind(this));
    } else if (root_name == "checkmainui") {
      var MainuiController = require("mainui_controller");
 
      var MainuiConst = require("mainui_const");
 
      var btn_index = MainuiController.getInstance().getMainUIIndex();
 
      if (btn_index != MainuiConst.btn_index.main_scene) {
        root_wnd = MainuiController.getInstance().getMainUiRoot(this.getFinishCB.bind(this)); // root_wnd = MainuiController.getInstance().getMainUiRoot();                
      } else {
        this.getFinishCB();
      }
    } else if (root_name == "adventurescene") {
      root_wnd = AdventureController.getInstance().getAdventureRoot();
    } else if (root_name == "partnerform") {
      root_wnd = HeroController.getInstance().getHeroFormRoot();
    } else if (root_name == "partnereinfoview") {
      var HeroController = require("hero_controller");
 
      root_wnd = HeroController.getInstance().getHeroMianInfoRoot(this.getFinishCB.bind(this));
    } else if (root_name == "partnergofight") {
      var HeroController = require("hero_controller");
 
      root_wnd = HeroController.getInstance().getHeroGoFightRoot(this.getFinishCB.bind(this));
    } else if (root_name == "hallowsactivitywindow") {
      var HallowsController = require("hallows_controller");
 
      root_wnd = HallowsController.getInstance().getHallowsActivityRoot(this.getFinishCB.bind(this));
    } else if (root_name == "hallowspreview") {
      var HallowsController = require("hallows_controller");
 
      root_wnd = HallowsController.getInstance().getHallowsPreviewRoot(this.getFinishCB.bind(this));
    } else if (root_name == "hallowswindow") {
      var HallowsController = require("hallows_controller");
 
      root_wnd = HallowsController.getInstance().getHallowsRoot(this.getFinishCB.bind(this));
    } else if (root_name == "adventureevtview") {
      root_wnd = AdventureController.getInstance().getAdventureEvtRoot();
    } else if (root_name == "esecsiceview") {
      var EsecsiceController = require("esecsice_controller");
 
      root_wnd = EsecsiceController.getInstance().getEsecsiceRoot(this.getFinishCB.bind(this));
    } else if (root_name == "stonedunview") {
      var Stone_dungeonController = require("stone_dungeon_controller");
 
      root_wnd = Stone_dungeonController.getInstance().getStoneDungeonRoot(this.getFinishCB.bind(this));
    } else if (root_name == "varietystoreview") {
      var MallController = require("mall_controller");
 
      root_wnd = MallController.getInstance().getVarietyStoreRoot(this.getFinishCB.bind(this));
    }
  },
  getFinishCB: function getFinishCB(target_root_wnd) {
    if (!target_root_wnd) {
      // 这个时候走第二种
      var act_list = this.target_data[3][1];
 
      if (act_list && act_list.length > 0) {
        this.act_list = Utils.deepCopy(act_list);
        this.guide_step = 0;
      }
    } else {
      this.target_root_wnd = target_root_wnd;
      var act_list = this.target_data[3][0];
 
      if (act_list && act_list.length > 0) {
        this.act_list = Utils.deepCopy(act_list);
        this.guide_step = 0;
      }
    }
 
    this.playNextGuide();
  },
  params2RootWndCB: function params2RootWndCB(roow_wnd) {
    if (roow_wnd && roow_wnd.active) {
      if (this.delay == 0) {
        this.playNextGuide();
      } else {
        this.delayPlayNextGuide(this.delay);
      }
    } else {
      this.endPlayGuide(true);
    }
  },
  findRootWndByParams2: function findRootWndByParams2(num) {
    if (this.target_data && this.target_data.length == 2) {
      var root_name = this.target_data[0];
      this.delay = this.target_data[1] || 0;
 
      if (root_name == "mainui") {
        var MainuiController = require("mainui_controller");
 
        this.target_root_wnd = MainuiController.getInstance().getMainUiRoot();
      } else if (root_name == "summon") {
        var PartnersummonController = require("partnersummon_controller");
 
        this.target_root_wnd = PartnersummonController.getInstance().getSummonItemRoot();
      } else if (root_name == "summonshow") {
        var PartnersummonController = require("partnersummon_controller");
 
        this.target_root_wnd = PartnersummonController.getInstance().getSummonShowRoot();
      } else if (root_name == "summonresult") {
        var PartnersummonController = require("partnersummon_controller");
 
        this.target_root_wnd = PartnersummonController.getInstance().getSummonResultRoot();
      } else if (root_name == "partner") {
        var HeroController = require("hero_controller");
 
        this.target_root_wnd = HeroController.getInstance().getHeroBagRoot();
      } else if (root_name == "partnerform") {
        this.target_root_wnd = HeroController.getInstance().getHeroFormRoot();
      } else if (root_name == "battlesceneview") {
        this.target_root_wnd = BattleController.getInstance().getCtrlBattleScene();
      } else if (root_name == "partnereinfoview") {
        var HeroController = require("hero_controller");
 
        this.target_root_wnd = HeroController.getInstance().getHeroMianInfoRoot();
      } else if (root_name == "partnergofight") {
        var HeroController = require("hero_controller");
 
        this.target_root_wnd = HeroController.getInstance().getHeroGoFightRoot();
      } else if (root_name == "battlequickview") {
        var BattleDramaController = require("battle_drama_controller");
 
        this.target_root_wnd = BattleDramaController.getInstance().getDramBattleQuickRoot();
      } else if (root_name == "battletophookrewards") {
        var BattleDramaController = require("battle_drama_controller");
 
        this.target_root_wnd = BattleDramaController.getInstance().getDramaBattleHookRewardRoot();
      } else if (root_name == "battletoppassrewards") {
        var BattleDramaController = require("battle_drama_controller");
 
        this.target_root_wnd = BattleDramaController.getInstance().getDramaBattlePassRewardRoot();
      } else if (root_name == "battletopscene") {
        var BattleController = require("battle_controller");
 
        this.target_root_wnd = BattleController.getInstance().getDramaFightUI();
      } else if (root_name == "getitemview") {
        var MainuiController = require("mainui_controller");
 
        this.target_root_wnd = MainuiController.getInstance().getItemExhibtionRoot();
      } else if (root_name == "backpack") {
        var BackpackController = require("backpack_controller");
 
        this.target_root_wnd = BackpackController.getInstance().getBackpackRoot();
      } else if (root_name == "backpacksell") {
        this.target_root_wnd = BackpackController.getInstance().getBackpackSellRoot();
      } else if (root_name == "arenaloopview") {
        var ArenaController = require("arena_controller");
 
        this.target_root_wnd = ArenaController.getInstance().getArenaRoot();
      } else if (root_name == "guildinitview") {
        this.target_root_wnd = GuildController.getInstance().getGuildInitRoot();
      } else if (root_name == "startowerview") {
        var StartowerController = require("startower_controller");
 
        this.target_root_wnd = StartowerController.getInstance().getStarTowerRoot();
      } else if (root_name == "startowerchallengeview") {
        var StartowerController = require("startower_controller");
 
        this.target_root_wnd = StartowerController.getInstance().getStarTowerChallengeRoot();
      } else if (root_name == "auguryview") {
        this.target_root_wnd = AuguryController.getInstance().getAuguryRoot();
      } else if (root_name == "summonshowview") {
        this.target_root_wnd = PartnersummonController.getInstance().getSummonShowRoot();
      } else if (root_name == "mallview") {
        this.target_root_wnd = MallController.getInstance().getMallRoot();
      } else if (root_name == "adventurescene") {
        this.target_root_wnd = AdventureController.getInstance().getAdventureRoot();
      } else if (root_name == "adventureevtview") {
        this.target_root_wnd = AdventureController.getInstance().getAdventureEvtRoot();
      } else if (root_name == "adventurenextfloor") {
        this.target_root_wnd = AdventureController.getInstance().getNextAlertRoot();
 
        var BattleDramaController = require("battle_drama_controller");
 
        this.target_root_wnd = BattleDramaController.getInstance().getBattleQingbaoRoot();
      } else if (root_name == "battleqingbaoview") {} else if (root_name == "tipssourceroot") {
        this.target_root_wnd = BackpackController.getInstance().getItemTipsSourceRoot();
      } else if (root_name == "skybattleresult") {
        this.target_root_wnd = BattleController.getInstance().getFinishView(BattleConst.Fight_Type.Adventrue);
      } else if (root_name == "activitywindow") {
        this.target_root_wnd = ActivityController.getInstance().getActivityRoot();
      } else if (root_name == "hallowswindow") {
        var HallowsController = require("hallows_controller");
 
        this.target_root_wnd = HallowsController.getInstance().getHallowsRoot();
      } else if (root_name == "hallowsactivitywindow") {
        var HallowsController = require("hallows_controller");
 
        this.target_root_wnd = HallowsController.getInstance().getHallowsActivityRoot();
      } else if (root_name == "hallowspreview") {
        var HallowsController = require("hallows_controller");
 
        this.target_root_wnd = HallowsController.getInstance().getHallowsPreviewRoot();
      } else if (root_name == "comptipsview") {
        var TipsController = require("tips_controller");
 
        this.target_root_wnd = TipsController.getInstance().getCompTipsRoot();
      } else if (root_name == "esecsiceview") {
        var EsecsiceController = require("esecsice_controller");
 
        this.target_root_wnd = EsecsiceController.getInstance().getEsecsiceRoot();
      } else if (root_name == "stonedunview") {
        var Stone_dungeonController = require("stone_dungeon_controller");
 
        this.target_root_wnd = Stone_dungeonController.getInstance().getStoneDungeonRoot();
      } else if (root_name == "varietystoreview") {
        var MallController = require("mall_controller");
 
        this.target_root_wnd = MallController.getInstance().getVarietyStoreRoot();
      } else if (root_name == "sevenloginview") {
        var ActionController = require("action_controller");
 
        this.target_root_wnd = ActionController.getInstance().getSevenLoginRoot();
      } else if (root_name == "welfareview") {
        var WelfareController = require("welfare_controller");
 
        this.target_root_wnd = WelfareController.getInstance().getWelfareRoot();
      } else if (root_name == "treasureview") {
        var ActionController = require("action_controller");
 
        this.target_root_wnd = ActionController.getInstance().getTreasureRoot();
      } else if (root_name == "voyageview") {
        var VoyageController = require("voyage_controller");
 
        this.target_root_wnd = VoyageController.getInstance().getVoyageMainRoot();
      } else if (root_name == "strongerview") {
        var StrongerController = require("stronger_controller");
 
        this.target_root_wnd = StrongerController.getInstance().getStrongerRoot();
      } else if (root_name == "seerpalaceview") {
        var SeerpalaceController = require("seerpalace_controller");
 
        this.target_root_wnd = SeerpalaceController.getInstance().getSeerpalaceMainRoot();
      } else if (root_name == "voyagedispatchview") {
        var VoyageController = require("voyage_controller");
 
        this.target_root_wnd = VoyageController.getInstance().getVoyageDispatchRoot();
      }
 
      if (this.target_root_wnd) {
        if (this.delay == 0) {
          this.playNextGuide();
        } else {
          this.delayPlayNextGuide(this.delay);
        }
 
        if (this.timer_hander) this.removeTimer();
      } else {
        if (!this.timer_hander) {
          // this.time_num = 0;
          this.timer_hander = this.startUpdate(10, this.findRootWndByParams2.bind(this), 1000);
        }
      } // this.time_num++;
 
 
      if (num && num >= 9) {
        this.removeTimer();
        this.endPlayGuide(true);
      }
    }
  },
  findRootWndByParams3: function findRootWndByParams3() {
    if (!this.target_data) return;
    var root_name = this.target_data[1];
    this.delay = this.target_data[2]; // newfirstrecharge
 
    if (root_name == "firstrecharge") {
      ActionController.getInstance().openFirstChargeView(true);
    } else if (root_name == "newfirstrecharge" || root_name == "firstrecharge1") {
      var NewFirstChargeController = require("newfirstcharge_controller");
 
      NewFirstChargeController.getInstance().openNewFirstChargeView(true);
    }
 
    if (this.delay == 0) {
      this.playNextGuide();
    } else {
      this.delayPlayNextGuide(this.delay);
    }
  },
  //==============================--
  //desc:根据4个参数查找对象,主要用于主场景的移动顺便只想对象以及检测窗体状态
  //time:2017-08-21 10:14:38
  //@return 
  //==============================--
  findRootWndByParams4: function findRootWndByParams4() {
    if (!this.target_data) return;
    var root_name = this.target_data[1];
    var taget_id = this.target_data[2];
    this.delay = this.target_data[3];
 
    if (root_name == "centercity") {
      var MainSceneController = require("mainscene_controller");
 
      MainSceneController.getInstance().getCenterCityBuildById(taget_id, function (build_item) {
        if (build_item && build_item.root_wnd) {
          MainSceneController.getInstance().moveToBuild(taget_id);
          this.target_root_wnd = build_item.root_wnd;
 
          if (this.delay == 0) {
            this.playNextGuide();
          } else {
            this.delayPlayNextGuide(this.delay);
          }
        } else {
          this.endPlayGuide(true);
        }
      }.bind(this));
    }
  },
  findTargetByParams: function findTargetByParams() {
    if (this.target_data) {
      this.target_type = this.target_data[0]; // 是根据名字查找还是根据tag查找
 
      this.delay = this.target_data[1] || 0; // 处理完当前引导之后,到下一个引导的间隔事件
 
      this.target_name = this.target_data[2]; // 需要查找的对象的标志,可能是name或者tag
 
      var target_clickback = this.target_data[3] || 0; // 是否是自身点击返回
 
      this.need_save = this.target_data[4] || 0; // 如果需要保存的话,那么就要配置这个步骤为1,如果是2就是记录自己,并且记录上一步,同时如果这个需要记录,则会跟服务器交互,一般是消耗材料的步骤
 
      this.close_all = this.target_data[5] || 0; // 是否需要关闭所有窗体
 
      this.wait_delay = this.target_data[6] || 0; // 如果配置了时间,则表示这一步,不是需要点击处理的,而是等这个时间自动下一步
 
      this.show_guide_step = this.target_data[7] || true; // 有一类窗体不需要显示也不需要显示手指到的,这个时候就用这个参数控制            
 
      this.figer_off_x = this.target_data[8] || 0; // 引导的偏移x
 
      this.figer_off_y = this.target_data[9] || 0; // 引导的偏移y
 
      this.guide_msg = this.target_data[10] || ""; // 引导描述框的内容描述
 
      this.sprite_off_x = this.target_data[11] || 0; // 引导描述框的偏移x
 
      this.sprite_off_y = this.target_data[12] || 0; // 引导描述框的偏移y
 
      this.sprite_flip = this.target_data[13] || 0; // 引导描述框的翻转
 
      this.bg_opacity = typeof this.target_data[14] == "number" ? this.target_data[14] : 100; // this.bg_opacity = this.target_data[14] || 100;        // 压黑背景透明度
 
      this.sound_name = this.target_data[15] || ""; // 引导音效
 
      this.findTargetByRootND();
    }
  },
  findTargetByRootND: function findTargetByRootND(num) {
    if (this.target_type == "name") {
      var real_name = GuideConst.NodeKeys[this.target_name];
      var name_info = GuideConst.getNameInfo(this.target_name);
      if (!real_name) real_name = this.target_name;
 
      if (name_info && name_info.length == 2) {
        if (name_info[0] == "tag") {
          this.target = this.seekChildByTag(this.target_root_wnd, name_info[1]);
        }
      } else {
        this.target = this.seekChild(this.target_root_wnd, real_name);
      }
    } else if (this.target_type == "tag") {
      this.target = this.seekChildByTag(this.target_root_wnd, this.target_name);
    }
 
    if (this.target) {
      this.removeTimer();
      this.drawTargetRect();
 
      if (this.wait_delay == 0) {
        this.once_hander = this.target.once(cc.Node.EventType.TOUCH_END, function () {
          if (this.act_config) this.checkDoNextGuide();
          this.showSkipBtn(); // if (this.delay > 0) {
          //     this.addTicket(this.checkDoNextGuide.bind(this), this.delay);
          // } else {                    
          //     this.checkDoNextGuide();
          // }
        }, this);
      } else {
        this.delayPlayNextGuide(this.wait_delay);
      }
    } else {
      if (!this.timer_hander) {
        this.time_num = 0;
        this.timer_hander = this.startUpdate(6, this.findTargetByRootND.bind(this), 1000);
      }
    }
 
    if (num && num >= 5) {
      this.removeTimer();
      this.endPlayGuide(true);
    }
  },
  saveGuideStep: function saveGuideStep() {
    if (this.config && this.config.over_step && this.config.over_step == this.guide_step) {
      if (!this.guide_cache_data[this.config.id]) this.guide_cache_data[this.config.id] = {};
      this.guide_cache_data[this.config.id][this.config.over_step] = true;
 
      var RoleController = require("role_controller");
 
      var role_vo = RoleController.getInstance().getRoleVo();
      cc.sys.localStorage.setItem("guide_data" + role_vo.srv_id + role_vo.rid, JSON.stringify(this.guide_cache_data));
    }
  },
  clearTargetInfo: function clearTargetInfo() {},
  endPlayGuide: function endPlayGuide(is_skip) {
    cc.log("结束当前引导---" + this.act_config.id);
    this.guide_step = 0;
    gcore.GlobalEvent.fire(GuideEvent.NewPlayerGuideClose);
 
    if (this.hasTicket("delayPlayNextGuide")) {
      this.delTicker("delayPlayNextGuide");
    }
 
    if (this.ctrl) this.ctrl.startPlayGuide(false, this.act_config.id, is_skip);
    if (this.model) this.model.setGuideLastPos(null);
    this.background_bi.enabled = false;
    this.act_config = null;
    this.hideSKipBtn();
  },
  findNodeByName: function findNodeByName() {},
  findNodeByTag: function findNodeByTag() {},
  removeTimer: function removeTimer() {
    if (this.timer_hander) {
      this.stopUpdate(this.timer_hander);
      this.time_num = 0;
      this.timer_hander = null;
    }
  },
  drawTargetRect: function drawTargetRect() {
    if (this.target) {
      this.clip_con_nd.active = true;
      this.effect_con_nd.active = true; // this.background_bi.enabled = false;
 
      var target_pos_1 = this.target.convertToWorldSpaceAR(cc.v2(0, 0));
      var target_pos = this.root_wnd.convertToNodeSpaceAR(target_pos_1);
      if (target_pos.y < target_pos_1.y) target_pos.y = target_pos_1.y;
      var final_posX = target_pos.x + (0.5 - this.target.anchorX) * this.target.width + this.figer_off_x || 0;
      var final_posY = target_pos.y + (0.5 - this.target.anchorY) * this.target.height;
      var final_pos = cc.v2(final_posX, final_posY);
      this.clip_con_nd.position = final_pos;
      this.clip_con_nd.width = this.target.width;
      this.clip_con_nd.height = this.target.height; // this.effect_con_nd.position = final_pos;
 
      if (this.bg_opacity > 0) {
        this.guide_clip_nd.active = true;
        this.guide_clip_nd.position = final_pos; // this.guide_clip_nd.width = this.target.width;
        // this.guide_clip_nd.height = this.target.height;
      } else {
        this.guide_clip_nd.active = false;
      }
 
      if (this.show_guide_step) {
        // 显示手指
        var last_pos = this.model.getGuideLastPos(); // 显示手指
 
        var action_name = PlayerAction.action_1;
        if (last_pos) action_name = PlayerAction.action_2;
        var eff_res = PathTool.getEffectRes(240);
        var eff_path = PathTool.getSpinePath(eff_res);
        this.loadRes(eff_path, function (action_name, eff_sd) {
          this.effect_con_sk.skeletonData = eff_sd;
          this.effect_con_sk.setAnimation(0, action_name, true);
          this.background_bi.enabled = false;
        }.bind(this, action_name));
        this.effect_con_nd.stopAllActions();
 
        if (last_pos) {
          var move_dis = this.calDistanch(final_pos, last_pos);
          var time = move_dis / GuideConst.Finger_Speed;
          var call_func = cc.callFunc(function () {
            this.clip_mask_bl.enabled = false;
            this.effect_con_sk.setAnimation(0, PlayerAction.action_1, true);
            this.finish_action = true;
          }, this);
          var move_act = cc.moveTo(time, final_pos);
          var act_queqe = cc.sequence(move_act, call_func);
          this.effect_con_nd.runAction(act_queqe);
          this.finish_action = false;
        } else {
          this.effect_con_nd.position = final_pos;
        }
 
        if (this.guide_msg == "") {
          this.showNoticeContainer();
        } else {
          this.showLittleSpiritAndTips(final_pos);
 
          if (this.effect_con_nd.active) {
            // this.effect_con_nd.active = false;
            this.showNoticeContainer();
          }
        }
      } else {
        this.background_bi.enabled = false;
      } // 显示小精灵
 
 
      this.model.setGuideLastPos(final_pos);
    }
  },
  onClickMaskBg: function onClickMaskBg() {
    if (this.effect_con_nd.active && this.effect_con_sk.skeletonData && this.effect_con_sk.animation == "action1") {
      if (!this.notice_effect) {
        this.notice_effect_nd = new cc.Node();
        this.root_wnd.addChild(this.notice_effect_nd);
        this.notice_effect = this.notice_effect_nd.addComponent(sp.Skeleton);
        this.notice_effect.setEndListener(this.noticeAnimaEnd.bind(this));
        this.notice_effect_nd.position = this.effect_con_nd.position;
        var spine_res = PathTool.getEffectRes("198");
        var spine_path = PathTool.getSpinePath(spine_res);
        this.loadRes(spine_path, function (notice_sd) {
          this.notice_effect.skeletonData = notice_sd;
          this.notice_effect.setAnimation(0, "action", false);
        }.bind(this));
      } else {
        this.notice_effect_nd.position = this.effect_con_nd.position;
        this.notice_effect_nd.active = true;
 
        if (this.notice_effect.skeletonData) {
          this.notice_effect.setAnimation(0, "action", false);
        }
      }
    }
  },
  noticeAnimaEnd: function noticeAnimaEnd() {
    this.notice_effect.clearTracks();
    this.notice_effect_nd.active = false;
  },
  onClickSkipBtn: function onClickSkipBtn() {
    this.endPlayGuide(true);
  },
  calDistanch: function calDistanch(pos1, pos2) {
    return Math.sqrt(Math.pow(pos1.x - pos2.x, 2) + Math.pow(pos1.y - pos2.y, 2));
  },
  showNoticeContainer: function showNoticeContainer() {},
  showLittleSpiritAndTips: function showLittleSpiritAndTips(tar_pos) {
    this.mas_con_nd.active = true;
    this.msg_txt_rt.string = this.guide_msg;
    this.msg_bg_nd.height = this.msg_txt_nd.height + 30;
    this.updateGuideTipsBgPos(tar_pos);
  },
  updateGuideTipsBgPos: function updateGuideTipsBgPos(tar_pos) {
    var original_size = this.root_wnd.getContentSize(); // 确定x的值
 
    var is_x_filp = false;
    var final_x = tar_pos.x;
 
    if (tar_pos.x < original_size.width * 0.5) {
      is_x_filp = false;
      final_x = tar_pos.x + this.msg_bg_nd.width * 0.5;
    } else {
      is_x_filp = true;
      final_x = tar_pos.x - this.msg_bg_nd.width * 0.5;
    } // 确定
 
 
    var is_y_filp = false;
    var final_y = tar_pos.y;
 
    if (tar_pos.y < original_size.height * 0.5) {
      is_y_filp = false;
      final_y = tar_pos.y + this.clip_con_nd.height;
    } else {
      is_y_filp = true;
      final_y = tar_pos.y - this.clip_con_nd.height;
    }
 
    if (is_x_filp) {
      this.msg_bg_nd.scaleX = -1;
    } else {
      this.msg_bg_nd.scaleX = 1;
    }
 
    if (is_y_filp) {
      this.msg_bg_nd.scaleY = -1;
      this.msg_bg_nd.y += 10;
    } else {
      this.msg_bg_nd.scaleY = 1;
      this.msg_bg_nd.y = 0;
    }
 
    this.mas_con_nd.position = cc.v2(final_x, final_y);
  },
  showSkipBtn: function showSkipBtn() {
    if (this.act_config && this.act_config.skip) {
      if (this.hasTicket("skip_btn_show")) this.delTicker("skip_btn_show");
      if (this.skip_btn_nd.active) this.skip_btn_nd.active = false;
      this.addTicket(function () {
        this.skip_btn_nd.active = true;
        var btn_act = this.getSkipBtnAct();
        this.skip_btn_nd.runAction(btn_act);
      }.bind(this), 5, "skip_btn_show");
    } else {
      this.skip_btn_nd.active = false;
    }
  },
  hideSKipBtn: function hideSKipBtn() {
    if (this.hasTicket("skip_btn_show")) this.delTicker("skip_btn_show");
    this.skip_btn_nd.stopAllActions();
    this.skip_btn_nd.active = false;
  },
  getSkipBtnAct: function getSkipBtnAct() {
    var fadein = cc.fadeIn(0.7);
    var fadeout = cc.fadeOut(0.4);
    return cc.repeatForever(cc.sequence(fadein, fadeout));
  },
  adjustGuide: function adjustGuide() {
    if (this.clip_con_nd.active && this.finish_action) {
      var target_pos = this.target.convertToWorldSpaceAR(cc.v2(0, 0));
      target_pos = this.root_wnd.convertToNodeSpaceAR(target_pos);
      var final_posX = target_pos.x + (0.5 - this.target.anchorX) * this.target.width + this.figer_off_x || 0;
      var final_posY = target_pos.y + (0.5 - this.target.anchorY) * this.target.height;
      var final_pos = cc.v2(final_posX, final_posY);
 
      if (this.clip_con_nd.x !== final_pos.x || this.clip_con_nd.y !== final_pos.y) {
        this.clip_con_nd.x = final_pos.x;
        this.clip_con_nd.y = final_pos.y;
      }
    }
  },
  resetGuide: function resetGuide() {
    cc.log("断线重连重新执行引导"); // Utils.closeAllWindow();
 
    if (!this.act_config) return;
 
    var MainuiController = require("mainui_controller");
 
    var MainuiConst = require("mainui_const");
 
    MainuiController.getInstance().changeMainUIStatus(MainuiConst.btn_index.main_scene);
 
    if (this.timer_hander) {
      this.stopUpdate(this.timer_hander);
      this.time_num = 0;
      this.timer_hander = null;
    }
 
    if (this.hasTicket("delayPlayNextGuide")) this.delTicker("delayPlayNextGuide");
    this.hideSKipBtn();
    if (this.guide_clip_nd.active) this.guide_clip_nd.active = false;
    if (this.clip_con_nd.active) this.clip_con_nd.active = false;
    if (this.effect_con_nd.active) this.effect_con_nd.active = false;
    this.background_bi.enabled = false;
    if (this.mas_con_nd.active) this.mas_con_nd.active = false;
    this.wait_status_time_ticket = gcore.Timer.set(function () {
      if (this.model) this.model.setGuideLastPos(null);
      this.playGuide(this.act_config);
    }.bind(this), 1000, 1);
  },
  disconnect: function disconnect() {
    this.background_bi.enabled = true;
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlkZVxcdmlld1xcZ3VpZGVfbWFpbl93aW5kb3cuanMiXSwibmFtZXMiOlsiUGF0aFRvb2wiLCJyZXF1aXJlIiwiR3VpZGVDb25zdCIsIkd1aWRlRXZlbnQiLCJHdWlkZV9tYWluV2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsIm1zZyIsImN0cmwiLCJhcmd1bWVudHMiLCJtb2RlbCIsImdldE1vZGVsIiwiaW5pdENvbmZpZyIsImFkanVzdF9ndWlkZV90aW1lciIsInRpbWVyX2hhbmRlciIsInRpbWVfbnVtIiwib3BlbkNhbGxCYWNrIiwibG9nIiwiZ2FtZSIsInZpZXdzX2pzIiwiY2FuY2VsVG91Y2giLCJyb290X3dnIiwicm9vdF93bmQiLCJnZXRDb21wb25lbnQiLCJXaWRnZXQiLCJ3aW5kb3ciLCJGSVRfU0NBTEUiLCJpc0FsaWduVG9wIiwiaXNBbGlnbkJvdHRvbSIsImJhY2tncm91bmRfbmQiLCJzZWVrQ2hpbGQiLCJjbGlwX2Nvbl9uZCIsImNsaXBfbWFza19uZCIsInNraXBfYnRuX25kIiwic2tpcF9idG5fd2QiLCJVU0VfU0RLIiwiUExBVEZPUk1fVFlQUiIsInRvcCIsImVmZmVjdF9jb25fbmQiLCJiYWNrZ3JvdW5kX2JpIiwiQmxvY2tJbnB1dEV2ZW50cyIsImVuYWJsZWQiLCJlZmZlY3RfY29uX3NrIiwic3AiLCJTa2VsZXRvbiIsImd1aWRlX2NsaXBfbmQiLCJjbGlwX21hc2tfYmwiLCJndWlkZV9tYXNrX25kIiwid2lkdGgiLCJtc2dfYmdfbmQiLCJtc2dfdHh0X25kIiwibXNnX3R4dF9ydCIsIlJpY2hUZXh0IiwibWFzX2Nvbl9uZCIsIm9uIiwiTm9kZSIsIkV2ZW50VHlwZSIsIlRPVUNIX0VORCIsIm9uQ2xpY2tNYXNrQmciLCJvbkNsaWNrU2tpcEJ0biIsIm9wZW5DYWNoZVZpZXciLCJyZWdpc3RlckV2ZW50IiwicmVfbGlua19nYW1lX2V2ZW50IiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImJpbmQiLCJFdmVudElkIiwiRVZUX1JFX0xJTktfR0FNRSIsIkVWVF9TT0NLRVRfRElTQ09OTkVDVCIsImRpc2Nvbm5lY3QiLCJvcGVuUm9vdFduZCIsInBhcmFtcyIsImFjdF9jb25maWciLCJwbGF5R3VpZGUiLCJjbG9zZUNhbGxCYWNrIiwiYWRkR3VpZCIsImd1aWRlX2NmZyIsImNvbmZpZyIsImZvckJpZFRvdWNoIiwiZmlyZSIsIk5ld1BsYXllckd1aWRlU3RhcnQiLCJhY3RfbGlzdCIsIlV0aWxzIiwiZGVlcENvcHkiLCJhY3QiLCJjdXJfem9uZV9saXN0IiwibmVlZF9zYXZlIiwiZ3VpZGVfc3RlcCIsImd1aWRlX2NhY2hlX2RhdGEiLCJwbGF5TmV4dEd1aWRlIiwic2hvd1NraXBCdG4iLCJjaGVja0RvTmV4dEd1aWRlIiwidGFyZ2V0Iiwic2F2ZUd1aWRlU3RlcCIsImNsb3NlX2FsbCIsImNsb3NlQWxsV2luZG93IiwicmVhZHlEb05leHRHdWlkZSIsImVuZFBsYXlHdWlkZSIsInNlbmQxMTEyMSIsImlkIiwiZG9OZXh0R3VpZGVGcm9tU2VydmVyIiwic3RlcCIsImhpZGVTS2lwQnRuIiwiYWN0aXZlIiwiZGVsYXkiLCJkZWxheVBsYXlOZXh0R3VpZGUiLCJkZWxheV90aW1lIiwiaGFzVGlja2V0IiwiZGVsVGlja2VyIiwiYWRkVGlja2V0IiwiY2xlYXJUYXJnZXRJbmZvIiwibGVuZ3RoIiwidGFyZ2V0X2RhdGEiLCJzaGlmdCIsImZpcnN0X2FjdCIsImZpbmRSb290V25kQnlQYXJhbXM0IiwiZmluZFJvb3RXbmRCeVBhcmFtczMiLCJmaW5kUm9vdFduZEJ5Q29uZGl0aW9uIiwiZmluZFJvb3RXbmRCeVBhcmFtczIiLCJmaW5kVGFyZ2V0QnlQYXJhbXMiLCJhZGRTa2lwVGltZVRpY2tldCIsInJvb3RfbmFtZSIsIkhlcm9Db250cm9sbGVyIiwiZ2V0SW5zdGFuY2UiLCJnZXRIZXJvQmFnUm9vdCIsImdldEZpbmlzaENCIiwiQmF0dGxlQ29udHJvbGxlciIsIkJhdHRsZURyYW1hQ29udHJvbGxlciIsImdldERyYW1hRmlnaHRVSSIsImdldEN0cmxCYXR0bGVTY2VuZSIsIk1haW51aUNvbnRyb2xsZXIiLCJNYWludWlDb25zdCIsImJ0bl9pbmRleCIsImdldE1haW5VSUluZGV4IiwibWFpbl9zY2VuZSIsImdldE1haW5VaVJvb3QiLCJBZHZlbnR1cmVDb250cm9sbGVyIiwiZ2V0QWR2ZW50dXJlUm9vdCIsImdldEhlcm9Gb3JtUm9vdCIsImdldEhlcm9NaWFuSW5mb1Jvb3QiLCJnZXRIZXJvR29GaWdodFJvb3QiLCJIYWxsb3dzQ29udHJvbGxlciIsImdldEhhbGxvd3NBY3Rpdml0eVJvb3QiLCJnZXRIYWxsb3dzUHJldmlld1Jvb3QiLCJnZXRIYWxsb3dzUm9vdCIsImdldEFkdmVudHVyZUV2dFJvb3QiLCJFc2Vjc2ljZUNvbnRyb2xsZXIiLCJnZXRFc2Vjc2ljZVJvb3QiLCJTdG9uZV9kdW5nZW9uQ29udHJvbGxlciIsImdldFN0b25lRHVuZ2VvblJvb3QiLCJNYWxsQ29udHJvbGxlciIsImdldFZhcmlldHlTdG9yZVJvb3QiLCJ0YXJnZXRfcm9vdF93bmQiLCJwYXJhbXMyUm9vdFduZENCIiwicm9vd193bmQiLCJudW0iLCJQYXJ0bmVyc3VtbW9uQ29udHJvbGxlciIsImdldFN1bW1vbkl0ZW1Sb290IiwiZ2V0U3VtbW9uU2hvd1Jvb3QiLCJnZXRTdW1tb25SZXN1bHRSb290IiwiZ2V0RHJhbUJhdHRsZVF1aWNrUm9vdCIsImdldERyYW1hQmF0dGxlSG9va1Jld2FyZFJvb3QiLCJnZXREcmFtYUJhdHRsZVBhc3NSZXdhcmRSb290IiwiZ2V0SXRlbUV4aGlidGlvblJvb3QiLCJCYWNrcGFja0NvbnRyb2xsZXIiLCJnZXRCYWNrcGFja1Jvb3QiLCJnZXRCYWNrcGFja1NlbGxSb290IiwiQXJlbmFDb250cm9sbGVyIiwiZ2V0QXJlbmFSb290IiwiR3VpbGRDb250cm9sbGVyIiwiZ2V0R3VpbGRJbml0Um9vdCIsIlN0YXJ0b3dlckNvbnRyb2xsZXIiLCJnZXRTdGFyVG93ZXJSb290IiwiZ2V0U3RhclRvd2VyQ2hhbGxlbmdlUm9vdCIsIkF1Z3VyeUNvbnRyb2xsZXIiLCJnZXRBdWd1cnlSb290IiwiZ2V0TWFsbFJvb3QiLCJnZXROZXh0QWxlcnRSb290IiwiZ2V0QmF0dGxlUWluZ2Jhb1Jvb3QiLCJnZXRJdGVtVGlwc1NvdXJjZVJvb3QiLCJnZXRGaW5pc2hWaWV3IiwiQmF0dGxlQ29uc3QiLCJGaWdodF9UeXBlIiwiQWR2ZW50cnVlIiwiQWN0aXZpdHlDb250cm9sbGVyIiwiZ2V0QWN0aXZpdHlSb290IiwiVGlwc0NvbnRyb2xsZXIiLCJnZXRDb21wVGlwc1Jvb3QiLCJBY3Rpb25Db250cm9sbGVyIiwiZ2V0U2V2ZW5Mb2dpblJvb3QiLCJXZWxmYXJlQ29udHJvbGxlciIsImdldFdlbGZhcmVSb290IiwiZ2V0VHJlYXN1cmVSb290IiwiVm95YWdlQ29udHJvbGxlciIsImdldFZveWFnZU1haW5Sb290IiwiU3Ryb25nZXJDb250cm9sbGVyIiwiZ2V0U3Ryb25nZXJSb290IiwiU2VlcnBhbGFjZUNvbnRyb2xsZXIiLCJnZXRTZWVycGFsYWNlTWFpblJvb3QiLCJnZXRWb3lhZ2VEaXNwYXRjaFJvb3QiLCJyZW1vdmVUaW1lciIsInN0YXJ0VXBkYXRlIiwib3BlbkZpcnN0Q2hhcmdlVmlldyIsIk5ld0ZpcnN0Q2hhcmdlQ29udHJvbGxlciIsIm9wZW5OZXdGaXJzdENoYXJnZVZpZXciLCJ0YWdldF9pZCIsIk1haW5TY2VuZUNvbnRyb2xsZXIiLCJnZXRDZW50ZXJDaXR5QnVpbGRCeUlkIiwiYnVpbGRfaXRlbSIsIm1vdmVUb0J1aWxkIiwidGFyZ2V0X3R5cGUiLCJ0YXJnZXRfbmFtZSIsInRhcmdldF9jbGlja2JhY2siLCJ3YWl0X2RlbGF5Iiwic2hvd19ndWlkZV9zdGVwIiwiZmlnZXJfb2ZmX3giLCJmaWdlcl9vZmZfeSIsImd1aWRlX21zZyIsInNwcml0ZV9vZmZfeCIsInNwcml0ZV9vZmZfeSIsInNwcml0ZV9mbGlwIiwiYmdfb3BhY2l0eSIsInNvdW5kX25hbWUiLCJmaW5kVGFyZ2V0QnlSb290TkQiLCJyZWFsX25hbWUiLCJOb2RlS2V5cyIsIm5hbWVfaW5mbyIsImdldE5hbWVJbmZvIiwic2Vla0NoaWxkQnlUYWciLCJkcmF3VGFyZ2V0UmVjdCIsIm9uY2VfaGFuZGVyIiwib25jZSIsIm92ZXJfc3RlcCIsIlJvbGVDb250cm9sbGVyIiwicm9sZV92byIsImdldFJvbGVWbyIsInN5cyIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJzcnZfaWQiLCJyaWQiLCJKU09OIiwic3RyaW5naWZ5IiwiaXNfc2tpcCIsIk5ld1BsYXllckd1aWRlQ2xvc2UiLCJzdGFydFBsYXlHdWlkZSIsInNldEd1aWRlTGFzdFBvcyIsImZpbmROb2RlQnlOYW1lIiwiZmluZE5vZGVCeVRhZyIsInN0b3BVcGRhdGUiLCJ0YXJnZXRfcG9zXzEiLCJjb252ZXJ0VG9Xb3JsZFNwYWNlQVIiLCJ2MiIsInRhcmdldF9wb3MiLCJjb252ZXJ0VG9Ob2RlU3BhY2VBUiIsInkiLCJmaW5hbF9wb3NYIiwieCIsImFuY2hvclgiLCJmaW5hbF9wb3NZIiwiYW5jaG9yWSIsImhlaWdodCIsImZpbmFsX3BvcyIsInBvc2l0aW9uIiwibGFzdF9wb3MiLCJnZXRHdWlkZUxhc3RQb3MiLCJhY3Rpb25fbmFtZSIsIlBsYXllckFjdGlvbiIsImFjdGlvbl8xIiwiYWN0aW9uXzIiLCJlZmZfcmVzIiwiZ2V0RWZmZWN0UmVzIiwiZWZmX3BhdGgiLCJnZXRTcGluZVBhdGgiLCJsb2FkUmVzIiwiZWZmX3NkIiwic2tlbGV0b25EYXRhIiwic2V0QW5pbWF0aW9uIiwic3RvcEFsbEFjdGlvbnMiLCJtb3ZlX2RpcyIsImNhbERpc3RhbmNoIiwidGltZSIsIkZpbmdlcl9TcGVlZCIsImNhbGxfZnVuYyIsImNhbGxGdW5jIiwiZmluaXNoX2FjdGlvbiIsIm1vdmVfYWN0IiwibW92ZVRvIiwiYWN0X3F1ZXFlIiwic2VxdWVuY2UiLCJydW5BY3Rpb24iLCJzaG93Tm90aWNlQ29udGFpbmVyIiwic2hvd0xpdHRsZVNwaXJpdEFuZFRpcHMiLCJhbmltYXRpb24iLCJub3RpY2VfZWZmZWN0Iiwibm90aWNlX2VmZmVjdF9uZCIsImFkZENoaWxkIiwiYWRkQ29tcG9uZW50Iiwic2V0RW5kTGlzdGVuZXIiLCJub3RpY2VBbmltYUVuZCIsInNwaW5lX3JlcyIsInNwaW5lX3BhdGgiLCJub3RpY2Vfc2QiLCJjbGVhclRyYWNrcyIsInBvczEiLCJwb3MyIiwiTWF0aCIsInNxcnQiLCJwb3ciLCJ0YXJfcG9zIiwic3RyaW5nIiwidXBkYXRlR3VpZGVUaXBzQmdQb3MiLCJvcmlnaW5hbF9zaXplIiwiZ2V0Q29udGVudFNpemUiLCJpc194X2ZpbHAiLCJmaW5hbF94IiwiaXNfeV9maWxwIiwiZmluYWxfeSIsInNjYWxlWCIsInNjYWxlWSIsInNraXAiLCJidG5fYWN0IiwiZ2V0U2tpcEJ0bkFjdCIsImZhZGVpbiIsImZhZGVJbiIsImZhZGVvdXQiLCJmYWRlT3V0IiwicmVwZWF0Rm9yZXZlciIsImFkanVzdEd1aWRlIiwicmVzZXRHdWlkZSIsImNoYW5nZU1haW5VSVN0YXR1cyIsIndhaXRfc3RhdHVzX3RpbWVfdGlja2V0IiwiVGltZXIiLCJzZXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsUUFBUSxHQUFLQyxPQUFPLENBQUMsVUFBRCxDQUF4Qjs7QUFDQSxJQUFJQyxVQUFVLEdBQUdELE9BQU8sQ0FBQyxhQUFELENBQXhCOztBQUNBLElBQUlFLFVBQVUsR0FBR0YsT0FBTyxDQUFDLGFBQUQsQ0FBeEIsRUFFQTs7O0FBRUEsSUFBSUcsZ0JBQWdCLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQzVCLGFBQVNDLFFBRG1CO0FBRTVCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxVQUFMLEdBQWtCVCxRQUFRLENBQUNVLGFBQVQsQ0FBdUIsT0FBdkIs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Q0ksS0FBS3hFLFdBQUwsQ0FBaUJ3RSxNQUFqQixHQUEwQixLQUExQjtBQUVKLFFBQUksS0FBS2pFLGFBQUwsQ0FBbUJpRSxNQUF2QixFQUNJLEtBQUtqRSxhQUFMLENBQW1CaUUsTUFBbkIsR0FBNEIsS0FBNUI7QUFFSixTQUFLaEUsYUFBTCxDQUFtQkUsT0FBbkIsR0FBNkIsS0FBN0I7QUFFQSxRQUFJLEtBQUtZLFVBQUwsQ0FBZ0JrRCxNQUFwQixFQUNJLEtBQUtsRCxVQUFMLENBQWdCa0QsTUFBaEIsR0FBeUIsS0FBekI7QUFFSixTQUFLb08sdUJBQUwsR0FBK0I1USxLQUFLLENBQUM2USxLQUFOLENBQVlDLEdBQVosQ0FBZ0IsWUFBVTtBQUVyRCxVQUFJLEtBQUtuVSxLQUFULEVBQ0ksS0FBS0EsS0FBTCxDQUFXNE8sZUFBWCxDQUEyQixJQUEzQjtBQUVKLFdBQUs3SyxTQUFMLENBQWUsS0FBS0QsVUFBcEI7QUFDSCxLQU44QyxDQU03Q1AsSUFONkMsQ0FNeEMsSUFOd0MsQ0FBaEIsRUFNakIsSUFOaUIsRUFNWCxDQU5XLENBQS9CO0FBT0gsR0FqOEIyQjtBQW04QjVCSSxFQUFBQSxVQUFVLEVBQUUsc0JBQVc7QUFDbkIsU0FBSzlCLGFBQUwsQ0FBbUJFLE9BQW5CLEdBQTZCLElBQTdCO0FBQ0g7QUFyOEIyQixDQUFULENBQXZCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAg6L+Z6YeM5piv5o+P6L+w6L+Z5Liq56qX5L2T55qE5L2c55So55qEXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wNC0xOCAxMDoxNjoxNFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBQYXRoVG9vbCAgID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xudmFyIEd1aWRlQ29uc3QgPSByZXF1aXJlKFwiZ3VpZGVfY29uc3RcIik7XG52YXIgR3VpZGVFdmVudCA9IHJlcXVpcmUoXCJndWlkZV9ldmVudFwiKTtcblxuLy8gc3RvcEFsbEFjdGlvbnNcblxudmFyIEd1aWRlX21haW5XaW5kb3cgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZVZpZXcsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwiZHJhbWFcIiwgXCJndWlkZV9tYWluX3ZpZXdcIik7XG4gICAgICAgIHRoaXMudmlld1RhZyAgICA9IFNDRU5FX1RBRy5tc2c7ICAgICAgICAgICAgIC8v6K+l56qX5L2T5omA5bGedWnlsYLnuqcs5YWo5bGPdWnpnIDopoHlnKh1aeWxgizpnZ7lhajlsY91aeWcqGRpYWxvZ3Vl5bGCLOi/meS4quimgeazqOaEj1xuICAgICAgICAvLyB0aGlzLndpbl90eXBlICAgPSBXaW5UeXBlLkZ1bGw7ICAgICAgICAgICAgICAgICAgLy/mmK/lkKbmmK/lhajlsY/nqpfkvZMgIFdpblR5cGUuRnVsbCwgV2luVHlwZS5CaWcsIFdpblR5cGUuTWluaSwgV2luVHlwZS5UaXBzXG5cbiAgICAgICAgdGhpcy5jdHJsID0gYXJndW1lbnRzWzBdO1xuICAgICAgICB0aGlzLm1vZGVsID0gdGhpcy5jdHJsLmdldE1vZGVsKCk7XG4gICAgfSxcblxuICAgIC8vIOWIneWni+WMluS4gOS6m+mFjee9ruaVsOaNrizlj6/ku6XnlKjkuo7lo7DmmI7kuIDkupvlj5jph4/kuYvnsbvnmoRcbiAgICBpbml0Q29uZmlnOmZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmFkanVzdF9ndWlkZV90aW1lciA9IG51bGw7XG4gICAgICAgIHRoaXMudGltZXJfaGFuZGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy50aW1lX251bSA9IDA7XG4gICAgICAgIC8vIHZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIilcbiAgICAgICAgLy8gdmFyIHJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICAvLyB2YXIgZ3VpZGVfY2FjaGVfZGF0YSA9IGNjLnN5cy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImd1aWRlX2RhdGFcIiArIHJvbGVfdm8uc3J2X2lkICsgcm9sZV92by5yaWQpIHx8IHt9OyAgICAgICAgICAgICBcbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCO55qE5Zue6LCDLOWPr+S7peWcqOi/memHjOaNleiOt+ebuOWFs+iKgueCueaIluiAhee7hOS7tlxuICAgIG9wZW5DYWxsQmFjazpmdW5jdGlvbigpIHtcbiAgICAgICAgY2MubG9nKFwiOTk5OTk5OTk5OTk5OTk5OTk5OTlcIik7XG5cbiAgICAgICAgaWYgKGdhbWUudmlld3NfanMpXG4gICAgICAgICAgICBnYW1lLnZpZXdzX2pzLmNhbmNlbFRvdWNoKCk7XG5cbiAgICAgICAgdGhpcy5yb290X3dnID0gdGhpcy5yb290X3duZC5nZXRDb21wb25lbnQoY2MuV2lkZ2V0KTtcbiAgICAgICAgaWYgKHdpbmRvdy5GSVRfU0NBTEUgPiAxKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3Rfd2cuaXNBbGlnblRvcCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnJvb3Rfd2cuaXNBbGlnbkJvdHRvbSA9IHRydWU7ICAgICAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJhY2tncm91bmRfbmQgPSB0aGlzLnNlZWtDaGlsZChcImJhY2tncm91bmRcIik7XG4gICAgICAgIHRoaXMuY2xpcF9jb25fbmQgICA9IHRoaXMuc2Vla0NoaWxkKFwiY2xpcF9jb25cIik7XG4gICAgICAgIHRoaXMuY2xpcF9tYXNrX25kICA9IHRoaXMuc2Vla0NoaWxkKFwiY2xpcF9tYXNrXCIpO1xuXG4gICAgICAgIHRoaXMuc2tpcF9idG5fbmQgICA9IHRoaXMuc2Vla0NoaWxkKFwic2tpcF9idG5cIik7XG4gICAgICAgIHRoaXMuc2tpcF9idG5fd2QgPSB0aGlzLnNraXBfYnRuX25kLmdldENvbXBvbmVudChjYy5XaWRnZXQpO1xuICAgICAgICBpZihVU0VfU0RLID09IHRydWUgJiYgKFBMQVRGT1JNX1RZUFIgPT0gXCJXWF9TREtcIiB8fCBQTEFURk9STV9UWVBSID09IFwiU0hfU0RLXCIgfHwgUExBVEZPUk1fVFlQUiA9PSBcIlFRX1NES1wiKSl7XG4gICAgICAgICAgICB0aGlzLnNraXBfYnRuX3dkLnRvcCA9IDE1MDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQgPSB0aGlzLnNlZWtDaGlsZChcImVmZmVjdF9jb25cIik7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmJhY2tncm91bmRfYmkgPSB0aGlzLnNlZWtDaGlsZChcImJhY2tncm91bmRcIiwgY2MuQmxvY2tJbnB1dEV2ZW50cyk7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZF9iaS5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lZmZlY3RfY29uX3NrID0gdGhpcy5zZWVrQ2hpbGQoXCJlZmZlY3RfY29uXCIsIHNwLlNrZWxldG9uKTtcblxuICAgICAgICAvLyDooajnjrDlsYLkv6Hmga9cbiAgICAgICAgdGhpcy5ndWlkZV9jbGlwX25kID0gdGhpcy5zZWVrQ2hpbGQoXCJndWlkZV9jbGlwXCIpO1xuICAgICAgICB0aGlzLmNsaXBfbWFza19ibCAgPSB0aGlzLnNlZWtDaGlsZChcImd1aWRlX2NsaXBcIiwgY2MuQmxvY2tJbnB1dEV2ZW50cyk7XG4gICAgICAgIHRoaXMuZ3VpZGVfbWFza19uZCA9IHRoaXMuc2Vla0NoaWxkKFwiZ3VpZGVfbWFza1wiKTtcbiAgICAgICAgdGhpcy5ndWlkZV9tYXNrX25kLndpZHRoID0gdGhpcy5ndWlkZV9tYXNrX25kLndpZHRoICogd2luZG93LkZJVF9TQ0FMRTtcblxuICAgICAgICAvLyBtc2dcbiAgICAgICAgdGhpcy5tc2dfYmdfbmQgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJtc2dfYmdcIik7XG4gICAgICAgIHRoaXMubXNnX3R4dF9uZCAgICA9IHRoaXMuc2Vla0NoaWxkKFwibXNnX3R4dFwiKTtcbiAgICAgICAgdGhpcy5tc2dfdHh0X3J0ICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJtc2dfdHh0XCIsIGNjLlJpY2hUZXh0KTtcbiAgICAgICAgdGhpcy5tYXNfY29uX25kICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJtYXNfY29uXCIpO1xuXG4gICAgICAgIC8vIHRoaXMuYWRqdXN0X2d1aWRlX3RpbWVyID0gdGhpcy5zdGFydFVwZGF0ZSgxMCwgdGhpcy5hZGp1c3RHdWlkZS5iaW5kKHRoaXMpLCA1MDApO1xuICAgICAgICAvLyB0aGlzLmJhY2tncm91bmRfbmQuc2NhbGUgPSBGSVRfU0NBTEU7XG5cbiAgICAgICAgdGhpcy5jbGlwX21hc2tfbmQub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCB0aGlzLm9uQ2xpY2tNYXNrQmcsIHRoaXMpO1xuICAgICAgICB0aGlzLnNraXBfYnRuX25kLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgdGhpcy5vbkNsaWNrU2tpcEJ0biwgdGhpcyk7XG5cbiAgICAgICAgLy8gaWYgKHRoaXMuYWN0X2NvbmZpZylcbiAgICAgICAgLy8gICAgIHRoaXMuYWRkR3VpZCh0aGlzLmFjdF9jb25maWcpO1xuICAgIH0sXG5cbiAgICBvcGVuQ2FjaGVWaWV3OiBmdW5jdGlvbigpIHtcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5LqL5Lu255uR5ZCs55qE5o6l5Y+jLOS4jemcgOimgeaJi+WKqOiwg+eUqCzlpoLmnpzmmK/kvb/nlKhnY29yZS5HbG9iYWxFdmVudOebkeWQrCzlj6/ku6Xnm7TmjqXosIPnlKhhZGRHbG9iYWxFdmVudFxuICAgIHJlZ2lzdGVyRXZlbnQ6ZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIOaWree6v+S5i+WQjueahOWkhOeQhlxuICAgICAgICB0aGlzLnJlX2xpbmtfZ2FtZV9ldmVudCA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoRXZlbnRJZC5FVlRfUkVfTElOS19HQU1FLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJhY2tncm91bmRfYmkuZW5hYmxlZClcbiAgICAgICAgICAgICAgICB0aGlzLmJhY2tncm91bmRfYmkuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB9LmJpbmQodGhpcykpXG5cbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChnY29yZS5HbG9iYWxFdmVudC5FVlRfU09DS0VUX0RJU0NPTk5FQ1QsIChmdW5jdGlvbigpe1xuICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgfSxcblxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjizmt7vliqDliLDlr7nlupTkuLvoioLngrnkuYvlkI7nmoTlm57osIMs5Lmf5bCx5piv5LiA5Liq56qX5L2T55qE5q2j5byP5YWl5Y+jLOWPr+S7peiuvue9ruS4gOS6m+aVsOaNruS6hlxuICAgIG9wZW5Sb290V25kOmZ1bmN0aW9uKHBhcmFtcykge1xuICAgICAgICBjYy5sb2coXCI5OTk5OTk5OTk5OTk5OTk5OVwiKTtcbiAgICAgICAgaWYgKHRoaXMuYWN0X2NvbmZpZykge1xuICAgICAgICAgICAgY2MubG9nKFwiMjIyMjIyMlwiKTtcbiAgICAgICAgICAgIHRoaXMucGxheUd1aWRlKHRoaXMuYWN0X2NvbmZpZylcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDlhbPpl63nqpfkvZPlm57osIMs6ZyA6KaB5Zyo6L+Z6YeM6LCD55So6K+l56qX5L2T5omA5bGeY29udHJvbGxlcueahGNsb3Nl5pa55rOV5rKh55So5LqO572u56m66K+l56qX5L2T5a6e5L6L5a+56LGhXG4gICAgY2xvc2VDYWxsQmFjazpmdW5jdGlvbigpIHtcblxuICAgIH0sXG5cbiAgICBhZGRHdWlkOiBmdW5jdGlvbiAoZ3VpZGVfY2ZnKSB7XG4gICAgICAgIGNjLmxvZyhcIjQ0NDRcIik7XG4gICAgICAgIHRoaXMuYWN0X2NvbmZpZyA9IGd1aWRlX2NmZztcbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmQpIHtcbiAgICAgICAgICAgIGNjLmxvZyhcIjU1NVwiKTtcbiAgICAgICAgICAgIHRoaXMucGxheUd1aWRlKGd1aWRlX2NmZyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcGxheUd1aWRlOiBmdW5jdGlvbihjb25maWcpIHtcbiAgICAgICAgaWYgKGdhbWUudmlld3NfanMgJiYgIXRoaXMucm9vdF93bmQpIHtcbiAgICAgICAgICAgIGdhbWUudmlld3NfanMuZm9yQmlkVG91Y2goKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWRlRXZlbnQuTmV3UGxheWVyR3VpZGVTdGFydCk7XG5cbiAgICAgICAgY2MubG9nKFwi5b2T5YmN5q2j5Zyo5omn6KGM55qE5byV5a+86YWN572u6KGoXCIpO1xuICAgICAgICBjYy5sb2coY29uZmlnKTtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIGlmICghY29uZmlnKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZF9iaS5lbmFibGVkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmFjdF9saXN0ID0gVXRpbHMuZGVlcENvcHkoY29uZmlnLmFjdCk7XG4gICAgICAgIHRoaXMuY3VyX3pvbmVfbGlzdCA9IHt9O1xuXG4gICAgICAgIHRoaXMubmVlZF9zYXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZ3VpZGVfc3RlcCA9IDA7XG4gICAgICAgIHRoaXMuZ3VpZGVfY2FjaGVfZGF0YSA9IHt9O1xuICAgICAgICAvLyB0aGlzLmd1aWRlX2NhY2hlX2RhdGEgPSBSb2xlRW52OmdldEluc3RhbmNlKCk6Z2V0KFJvbGVFbnYua2V5cy5ndWlkZV9zdGVwX2xpc3QsIHt9KVxuICAgICAgICB0aGlzLnBsYXlOZXh0R3VpZGUoKTtcbiAgICAgICAgdGhpcy5zaG93U2tpcEJ0bigpO1xuICAgIH0sXG5cbiAgICBjaGVja0RvTmV4dEd1aWRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMudGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBzZWxmLnRhcmdldDpzZXRUb3VjaEVuYWJsZWQoZmFsc2UpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNhdmVHdWlkZVN0ZXAoKTtcblxuICAgICAgICAvLyB0aGlzLnNldFN3YWxsb3dUb3VjaGVzKHRydWUpXG4gICAgICAgIC8vIHNlbGYucmVjdCA9IG51bGw7XG5cbiAgICAgICAgLy8g5YWz6Zet5omA5pyJ56qX5L2TXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZF9iaS5lbmFibGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5jbG9zZV9hbGwpIHtcbiAgICAgICAgICAgIFV0aWxzLmNsb3NlQWxsV2luZG93KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubmVlZF9zYXZlKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWR5RG9OZXh0R3VpZGUoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFjdF9jb25maWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFBsYXlHdWlkZSgpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jdHJsLnNlbmQxMTEyMSh0aGlzLmFjdF9jb25maWcuaWQsIHRoaXMuZ3VpZGVfc3RlcCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZG9OZXh0R3VpZGVGcm9tU2VydmVyOiBmdW5jdGlvbihpZCwgc3RlcCkge1xuICAgICAgICBpZiAoIXRoaXMuYWN0X2NvbmZpZykgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5hY3RfY29uZmlnLmlkICE9IGlkIHx8IHRoaXMuZ3VpZGVfc3RlcCAhPSBzdGVwKSByZXR1cm47XG4gICAgICAgIHRoaXMucmVhZHlEb05leHRHdWlkZSgpO1xuICAgIH0sXG5cbiAgICByZWFkeURvTmV4dEd1aWRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgY2MubG9nKFwi5YeG5aSH5omn6KGM5LiL5LiA5q2l55qE5pON5L2cXCIpO1xuICAgICAgICAvLyBpZiAodGhpcy5ub3RpY2VfY29udGFpbmVyICYmIG5vdCB0b2x1YS5pc251bGwodGhpcy5ub3RpY2VfY29udGFpbmVyKSkge1xuICAgICAgICAvLyAgICAgdGhpcy5ub3RpY2VfY29udGFpbmVyLnNldFZpc2libGUoZmFsc2UpO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGlmICh0aGlzLmJhY2tncm91bmRMYXllciAmJiBub3QgdG9sdWEuaXNudWxsKHRoaXMuYmFja2dyb3VuZExheWVyKSkge1xuICAgICAgICAvLyAgICAgdGhpcy5iYWNrZ3JvdW5kTGF5ZXIuc2V0VmlzaWJsZShmYWxzZSk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gaWYgKHRoaXMuY2xpcE5vZGUgJiYgbm90IHRvbHVhLmlzbnVsbCh0aGlzLmNsaXBOb2RlKSkge1xuICAgICAgICAvLyAgICAgdGhpcy5jbGlwTm9kZS5zZXRWaXNpYmxlKGZhbHNlKTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBpZiAodGhpcy5ndWlkZV9lZmZlY3QgJiYgbm90IHRvbHVhLmlzbnVsbCh0aGlzLmd1aWRlX2VmZmVjdCkpIHtcbiAgICAgICAgLy8gICAgIGRvU3RvcEFsbEFjdGlvbnModGhpcy5ndWlkZV9lZmZlY3QpO1xuICAgICAgICAvLyAgICAgdGhpcy5ndWlkZV9lZmZlY3Quc2V0VmlzaWJsZShmYWxzZSk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gaWYgKHRoaXMuZ3VpZGVfdGlwc19iZyAmJiBub3QgdG9sdWEuaXNudWxsKHRoaXMuZ3VpZGVfdGlwc19iZykpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuZ3VpZGVfdGlwc19iZy5zZXRWaXNpYmxlKGZhbHNlKTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBpZiAodGhpcy50eHRfdGlwcyAmJiBub3QgdG9sdWEuaXNudWxsKHRoaXMudHh0X3RpcHMpKSB7XG4gICAgICAgIC8vICAgICB0aGlzLnR4dF90aXBzLnNldFZpc2libGUoZmFsc2UpO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGlmICh0aGlzLnRhcmdldCAmJiBub3QgdG9sdWEuaXNudWxsKHRoaXMudGFyZ2V0KSAmJiB0aGlzLnRhcmdldC5jbGVhckd1aWRlTGlzdGVuZXIpIHtcbiAgICAgICAgLy8gICAgIHRoaXMudGFyZ2V0LmNsZWFyR3VpZGVMaXN0ZW5lcigpXG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gaWYgKHRoaXMudGFyZ2V0KVxuICAgICAgICAvLyAgICAgdGhpcy50YXJnZXQub2ZmKCk7XG4gICAgICAgIHRoaXMuaGlkZVNLaXBCdG4oKTtcblxuICAgICAgICBpZiAodGhpcy5ndWlkZV9jbGlwX25kLmFjdGl2ZSlcbiAgICAgICAgICAgIHRoaXMuZ3VpZGVfY2xpcF9uZC5hY3RpdmUgPSBmYWxzZTsgICAgICAgIFxuXG4gICAgICAgIGlmICh0aGlzLmNsaXBfY29uX25kLmFjdGl2ZSlcbiAgICAgICAgICAgIHRoaXMuY2xpcF9jb25fbmQuYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuZWZmZWN0X2Nvbl9uZC5hY3RpdmUpXG4gICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gdGhpcy5iYWNrZ3JvdW5kX2JpLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMuY2xpcF9tYXNrX2JsLmVuYWJsZWQpXG4gICAgICAgICAgICB0aGlzLmNsaXBfbWFza19ibC5lbmFibGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5tYXNfY29uX25kLmFjdGl2ZSlcbiAgICAgICAgICAgIHRoaXMubWFzX2Nvbl9uZC5hY3RpdmUgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnRhcmdldCA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVsYXkgPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5wbGF5TmV4dEd1aWRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlbGF5UGxheU5leHRHdWlkZSh0aGlzLmRlbGF5KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBkZWxheVBsYXlOZXh0R3VpZGU6IGZ1bmN0aW9uKGRlbGF5X3RpbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzVGlja2V0KFwiZGVsYXlQbGF5TmV4dEd1aWRlXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmRlbFRpY2tlcihcImRlbGF5UGxheU5leHRHdWlkZVwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZFRpY2tldCh0aGlzLnBsYXlOZXh0R3VpZGUuYmluZCh0aGlzKSwgZGVsYXlfdGltZSwgXCJkZWxheVBsYXlOZXh0R3VpZGVcIik7XG4gICAgfSxcblxuICAgIHBsYXlOZXh0R3VpZGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNhdmVHdWlkZVN0ZXAoKVxuICAgICAgICB0aGlzLmNsZWFyVGFyZ2V0SW5mbygpXG4gICAgICAgIGlmICghdGhpcy5hY3RfbGlzdCB8fCB0aGlzLmFjdF9saXN0Lmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVuZFBsYXlHdWlkZSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRhcmdldF9kYXRhID0gdGhpcy5hY3RfbGlzdC5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5ndWlkZV9zdGVwID0gdGhpcy5ndWlkZV9zdGVwICsgMTtcblxuICAgICAgICAgICAgY2MubG9nKFwi5b2T5YmN5q2l6aqk55qE5pWw5o2uXCIpO1xuICAgICAgICAgICAgY2MubG9nKHRoaXMudGFyZ2V0X2RhdGEpO1xuXG4gICAgICAgICAgICAvLyDliKTmlq3lvZPliY3mraXpqqTmmK/lkKblt7Lnu4/lgZrov4fkuoYsXG4gICAgICAgICAgICBpZiAodGhpcy5ndWlkZV9jYWNoZV9kYXRhW3RoaXMuYWN0X2NvbmZpZy5pZF0gJiYgdGhpcy5ndWlkZV9jYWNoZV9kYXRhW3RoaXMuYWN0X2NvbmZpZy5pZF1bdGhpcy5ndWlkZV9zdGVwXSAmJiAhdGhpcy5jdXJfem9uZV9saXN0W3RoaXMuZ3VpZGVfc3RlcF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXlOZXh0R3VpZGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGFyZ2V0X2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0X2FjdCA9IHRoaXMudGFyZ2V0X2RhdGFbMF07XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaChmaXJzdF9hY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjaGVja3N0YXR1c1wiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kUm9vdFduZEJ5UGFyYW1zNCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwib3BlbnZpZXdcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZFJvb3RXbmRCeVBhcmFtczMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNvbmRpdG9uc3RhdHVzXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRSb290V25kQnlDb25kaXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVtcHR5c3RlcFwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5TmV4dEd1aWRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50YXJnZXRfZGF0YS5sZW5ndGggPT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRSb290V25kQnlQYXJhbXMyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRUYXJnZXRCeVBhcmFtcygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gXG5cbiAgICAgICAgICAgICAgICAgICAgLy8g6LaF6L+HNeenkuWwseWHuueOsOi3s+i/h+W8leWvvFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmFkZFNraXBUaW1lVGlja2V0KClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93U2tpcEJ0bigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBhZGRTa2lwVGltZVRpY2tldDogZnVuY3Rpb24oKSB7XG5cbiAgICB9LFxuXG4gICAgZmluZFJvb3RXbmRCeUNvbmRpdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy50YXJnZXRfZGF0YSB8fCAhdGhpcy50YXJnZXRfZGF0YVszXSkgcmV0dXJuO1xuXG4gICAgICAgIHZhciByb290X25hbWUgPSB0aGlzLnRhcmdldF9kYXRhWzFdXG4gICAgICAgIHRoaXMuZGVsYXkgPSB0aGlzLnRhcmdldF9kYXRhWzJdXG4gICAgICAgIHZhciByb290X3duZCA9IG51bGw7XG4gICAgICAgIGlmIChyb290X25hbWUgPT0gXCJwYXJ0bmVyXCIpIHtcbiAgICAgICAgICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICByb290X3duZCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0SGVyb0JhZ1Jvb3QodGhpcy5nZXRGaW5pc2hDQi5iaW5kKHRoaXMpKVxuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImJhdHRsZXRvcHNjZW5lXCIpIHtcbiAgICAgICAgICAgIHZhciBCYXR0bGVDb250cm9sbGVyID0gcmVxdWlyZShcImJhdHRsZV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBCYXR0bGVEcmFtYUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXREcmFtYUZpZ2h0VUkodGhpcy5nZXRGaW5pc2hDQi5iaW5kKHRoaXMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJiYXR0bGVzY2VuZXZpZXdcIikge1xuICAgICAgICAgICAgdmFyIEJhdHRsZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICByb290X3duZCA9IEJhdHRsZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRDdHJsQmF0dGxlU2NlbmUodGhpcy5nZXRGaW5pc2hDQi5iaW5kKHRoaXMpKSBcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJjaGVja21haW51aVwiKSB7XG4gICAgICAgICAgICB2YXIgTWFpbnVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgIHZhciBNYWludWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIik7XG4gICAgICAgICAgICB2YXIgYnRuX2luZGV4ID0gTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1haW5VSUluZGV4KCk7XG4gICAgICAgICAgICBpZiAoYnRuX2luZGV4ICE9IE1haW51aUNvbnN0LmJ0bl9pbmRleC5tYWluX3NjZW5lKSB7XG4gICAgICAgICAgICAgICAgcm9vdF93bmQgPSBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TWFpblVpUm9vdCh0aGlzLmdldEZpbmlzaENCLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgICAgIC8vIHJvb3Rfd25kID0gTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1haW5VaVJvb3QoKTsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RmluaXNoQ0IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJhZHZlbnR1cmVzY2VuZVwiKSB7XG4gICAgICAgICAgICByb290X3duZCA9IEFkdmVudHVyZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRBZHZlbnR1cmVSb290KClcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJwYXJ0bmVyZm9ybVwiKSB7XG4gICAgICAgICAgICByb290X3duZCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0SGVyb0Zvcm1Sb290KClcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJwYXJ0bmVyZWluZm92aWV3XCIpIHtcbiAgICAgICAgICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICByb290X3duZCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0SGVyb01pYW5JbmZvUm9vdCh0aGlzLmdldEZpbmlzaENCLmJpbmQodGhpcykpO1xuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcInBhcnRuZXJnb2ZpZ2h0XCIpIHtcbiAgICAgICAgICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICByb290X3duZCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0SGVyb0dvRmlnaHRSb290KHRoaXMuZ2V0RmluaXNoQ0IuYmluZCh0aGlzKSlcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJoYWxsb3dzYWN0aXZpdHl3aW5kb3dcIikge1xuICAgICAgICAgICAgdmFyIEhhbGxvd3NDb250cm9sbGVyID0gcmVxdWlyZShcImhhbGxvd3NfY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgIHJvb3Rfd25kID0gSGFsbG93c0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRIYWxsb3dzQWN0aXZpdHlSb290KHRoaXMuZ2V0RmluaXNoQ0IuYmluZCh0aGlzKSlcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJoYWxsb3dzcHJldmlld1wiKSB7XG4gICAgICAgICAgICB2YXIgSGFsbG93c0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGFsbG93c19jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBIYWxsb3dzQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEhhbGxvd3NQcmV2aWV3Um9vdCh0aGlzLmdldEZpbmlzaENCLmJpbmQodGhpcykpXG4gICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwiaGFsbG93c3dpbmRvd1wiKSB7XG4gICAgICAgICAgICB2YXIgSGFsbG93c0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGFsbG93c19jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBIYWxsb3dzQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEhhbGxvd3NSb290KHRoaXMuZ2V0RmluaXNoQ0IuYmluZCh0aGlzKSlcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJhZHZlbnR1cmVldnR2aWV3XCIpIHtcbiAgICAgICAgICAgIHJvb3Rfd25kID0gQWR2ZW50dXJlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEFkdmVudHVyZUV2dFJvb3QoKVxuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImVzZWNzaWNldmlld1wiKSB7XG4gICAgICAgICAgICB2YXIgRXNlY3NpY2VDb250cm9sbGVyID0gcmVxdWlyZShcImVzZWNzaWNlX2NvbnRyb2xsZXJcIik7ICAgICAgICAgICAgXG4gICAgICAgICAgICByb290X3duZCA9IEVzZWNzaWNlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEVzZWNzaWNlUm9vdCh0aGlzLmdldEZpbmlzaENCLmJpbmQodGhpcykpXG4gICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwic3RvbmVkdW52aWV3XCIpIHtcbiAgICAgICAgICAgIHZhciBTdG9uZV9kdW5nZW9uQ29udHJvbGxlciA9IHJlcXVpcmUoXCJzdG9uZV9kdW5nZW9uX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICByb290X3duZCA9IFN0b25lX2R1bmdlb25Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0U3RvbmVEdW5nZW9uUm9vdCh0aGlzLmdldEZpbmlzaENCLmJpbmQodGhpcykpXG4gICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwidmFyaWV0eXN0b3Jldmlld1wiKSB7XG4gICAgICAgICAgICB2YXIgTWFsbENvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFsbF9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBNYWxsQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFZhcmlldHlTdG9yZVJvb3QodGhpcy5nZXRGaW5pc2hDQi5iaW5kKHRoaXMpKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldEZpbmlzaENCOiBmdW5jdGlvbih0YXJnZXRfcm9vdF93bmQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXRfcm9vdF93bmQpIHtcbiAgICAgICAgICAgIC8vIOi/meS4quaXtuWAmei1sOesrOS6jOenjVxuICAgICAgICAgICAgdmFyIGFjdF9saXN0ID0gdGhpcy50YXJnZXRfZGF0YVszXVsxXTtcbiAgICAgICAgICAgIGlmIChhY3RfbGlzdCAmJiBhY3RfbGlzdC5sZW5ndGggPjApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdF9saXN0ID0gVXRpbHMuZGVlcENvcHkoYWN0X2xpc3QpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3VpZGVfc3RlcCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IHRhcmdldF9yb290X3duZDtcbiAgICAgICAgICAgIHZhciBhY3RfbGlzdCA9IHRoaXMudGFyZ2V0X2RhdGFbM11bMF07XG4gICAgICAgICAgICBpZiAoYWN0X2xpc3QgJiYgYWN0X2xpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0X2xpc3QgPSBVdGlscy5kZWVwQ29weShhY3RfbGlzdCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ndWlkZV9zdGVwID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBsYXlOZXh0R3VpZGUoKTtcbiAgICB9LFxuXG4gICAgcGFyYW1zMlJvb3RXbmRDQjogZnVuY3Rpb24ocm9vd193bmQpIHtcbiAgICAgICAgaWYgKHJvb3dfd25kICYmIHJvb3dfd25kLmFjdGl2ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVsYXkgPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGxheU5leHRHdWlkZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGF5UGxheU5leHRHdWlkZSh0aGlzLmRlbGF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW5kUGxheUd1aWRlKHRydWUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGZpbmRSb290V25kQnlQYXJhbXMyOuOAgGZ1bmN0aW9uKG51bSkge1xuICAgICAgICBpZiAodGhpcy50YXJnZXRfZGF0YSAmJiB0aGlzLnRhcmdldF9kYXRhLmxlbmd0aCA9PSAyKSB7XG4gICAgICAgICAgICB2YXIgcm9vdF9uYW1lID0gdGhpcy50YXJnZXRfZGF0YVswXTtcbiAgICAgICAgICAgIHRoaXMuZGVsYXkgPSB0aGlzLnRhcmdldF9kYXRhWzFdIHx8IDA7XG5cbiAgICAgICAgICAgIGlmIChyb290X25hbWUgPT0gXCJtYWludWlcIikge1xuICAgICAgICAgICAgICAgIHZhciBNYWludWlDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1haW5VaVJvb3QoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJzdW1tb25cIikge1xuICAgICAgICAgICAgICAgIHZhciBQYXJ0bmVyc3VtbW9uQ29udHJvbGxlciA9IHJlcXVpcmUoXCJwYXJ0bmVyc3VtbW9uX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRfcm9vdF93bmQgPSBQYXJ0bmVyc3VtbW9uQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFN1bW1vbkl0ZW1Sb290KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcInN1bW1vbnNob3dcIikge1xuICAgICAgICAgICAgICAgIHZhciBQYXJ0bmVyc3VtbW9uQ29udHJvbGxlciA9IHJlcXVpcmUoXCJwYXJ0bmVyc3VtbW9uX2NvbnRyb2xsZXJcIik7ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gUGFydG5lcnN1bW1vbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRTdW1tb25TaG93Um9vdCgpICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJzdW1tb25yZXN1bHRcIikge1xuICAgICAgICAgICAgICAgIHZhciBQYXJ0bmVyc3VtbW9uQ29udHJvbGxlciA9IHJlcXVpcmUoXCJwYXJ0bmVyc3VtbW9uX2NvbnRyb2xsZXJcIik7ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gUGFydG5lcnN1bW1vbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRTdW1tb25SZXN1bHRSb290KClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwicGFydG5lclwiKSB7XG4gICAgICAgICAgICAgICAgdmFyIEhlcm9Db250cm9sbGVyID0gcmVxdWlyZShcImhlcm9fY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0SGVyb0JhZ1Jvb3QoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwicGFydG5lcmZvcm1cIikge1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gSGVyb0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRIZXJvRm9ybVJvb3QoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJiYXR0bGVzY2VuZXZpZXdcIikge1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gQmF0dGxlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEN0cmxCYXR0bGVTY2VuZSgpIFxuICAgICAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJwYXJ0bmVyZWluZm92aWV3XCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgSGVyb0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gSGVyb0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRIZXJvTWlhbkluZm9Sb290KClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwicGFydG5lcmdvZmlnaHRcIikge1xuICAgICAgICAgICAgICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRfcm9vdF93bmQgPSBIZXJvQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEhlcm9Hb0ZpZ2h0Um9vdCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImJhdHRsZXF1aWNrdmlld1wiKSB7XG4gICAgICAgICAgICAgICAgdmFyIEJhdHRsZURyYW1hQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYXR0bGVfZHJhbWFfY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IEJhdHRsZURyYW1hQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldERyYW1CYXR0bGVRdWlja1Jvb3QoKSBcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwiYmF0dGxldG9waG9va3Jld2FyZHNcIikge1xuICAgICAgICAgICAgICAgIHZhciBCYXR0bGVEcmFtYUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmF0dGxlX2RyYW1hX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRfcm9vdF93bmQgPSBCYXR0bGVEcmFtYUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXREcmFtYUJhdHRsZUhvb2tSZXdhcmRSb290KClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwiYmF0dGxldG9wcGFzc3Jld2FyZHNcIikge1xuICAgICAgICAgICAgICAgIHZhciBCYXR0bGVEcmFtYUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmF0dGxlX2RyYW1hX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRfcm9vdF93bmQgPSBCYXR0bGVEcmFtYUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXREcmFtYUJhdHRsZVBhc3NSZXdhcmRSb290KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImJhdHRsZXRvcHNjZW5lXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgQmF0dGxlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYXR0bGVfY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IEJhdHRsZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXREcmFtYUZpZ2h0VUkoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwiZ2V0aXRlbXZpZXdcIikge1xuICAgICAgICAgICAgICAgIHZhciBNYWludWlDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEl0ZW1FeGhpYnRpb25Sb290KCkgXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImJhY2twYWNrXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgQmFja3BhY2tDb250cm9sbGVyID0gcmVxdWlyZShcImJhY2twYWNrX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRfcm9vdF93bmQgPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRCYWNrcGFja1Jvb3QoKSBcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwiYmFja3BhY2tzZWxsXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEJhY2twYWNrU2VsbFJvb3QoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJhcmVuYWxvb3B2aWV3XCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgQXJlbmFDb250cm9sbGVyID0gcmVxdWlyZShcImFyZW5hX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRfcm9vdF93bmQgPSBBcmVuYUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRBcmVuYVJvb3QoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJndWlsZGluaXR2aWV3XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IEd1aWxkQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEd1aWxkSW5pdFJvb3QoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJzdGFydG93ZXJ2aWV3XCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgU3RhcnRvd2VyQ29udHJvbGxlciA9IHJlcXVpcmUoXCJzdGFydG93ZXJfY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IFN0YXJ0b3dlckNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRTdGFyVG93ZXJSb290KCkgXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcInN0YXJ0b3dlcmNoYWxsZW5nZXZpZXdcIikge1xuICAgICAgICAgICAgICAgIHZhciBTdGFydG93ZXJDb250cm9sbGVyID0gcmVxdWlyZShcInN0YXJ0b3dlcl9jb250cm9sbGVyXCIpOyAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IFN0YXJ0b3dlckNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRTdGFyVG93ZXJDaGFsbGVuZ2VSb290KCkgXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImF1Z3VyeXZpZXdcIikge1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gQXVndXJ5Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEF1Z3VyeVJvb3QoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJzdW1tb25zaG93dmlld1wiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRfcm9vdF93bmQgPSBQYXJ0bmVyc3VtbW9uQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFN1bW1vblNob3dSb290KCkgXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcIm1hbGx2aWV3XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IE1hbGxDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TWFsbFJvb3QoKSBcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwiYWR2ZW50dXJlc2NlbmVcIikge1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gQWR2ZW50dXJlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEFkdmVudHVyZVJvb3QoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJhZHZlbnR1cmVldnR2aWV3XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IEFkdmVudHVyZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRBZHZlbnR1cmVFdnRSb290KClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwiYWR2ZW50dXJlbmV4dGZsb29yXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IEFkdmVudHVyZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXROZXh0QWxlcnRSb290KClcbiAgICAgICAgICAgICAgICB2YXIgQmF0dGxlRHJhbWFDb250cm9sbGVyID0gcmVxdWlyZShcImJhdHRsZV9kcmFtYV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gQmF0dGxlRHJhbWFDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0QmF0dGxlUWluZ2Jhb1Jvb3QoKSBcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwiYmF0dGxlcWluZ2Jhb3ZpZXdcIikge1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJ0aXBzc291cmNlcm9vdFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRfcm9vdF93bmQgPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRJdGVtVGlwc1NvdXJjZVJvb3QoKSBcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwic2t5YmF0dGxlcmVzdWx0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IEJhdHRsZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRGaW5pc2hWaWV3KEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuQWR2ZW50cnVlKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJhY3Rpdml0eXdpbmRvd1wiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRfcm9vdF93bmQgPSBBY3Rpdml0eUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRBY3Rpdml0eVJvb3QoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJoYWxsb3dzd2luZG93XCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgSGFsbG93c0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGFsbG93c19jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gSGFsbG93c0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRIYWxsb3dzUm9vdCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImhhbGxvd3NhY3Rpdml0eXdpbmRvd1wiKSB7XG4gICAgICAgICAgICAgICAgdmFyIEhhbGxvd3NDb250cm9sbGVyID0gcmVxdWlyZShcImhhbGxvd3NfY29udHJvbGxlclwiKTsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRfcm9vdF93bmQgPSBIYWxsb3dzQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEhhbGxvd3NBY3Rpdml0eVJvb3QoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJoYWxsb3dzcHJldmlld1wiKSB7XG4gICAgICAgICAgICAgICAgdmFyIEhhbGxvd3NDb250cm9sbGVyID0gcmVxdWlyZShcImhhbGxvd3NfY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IEhhbGxvd3NDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0SGFsbG93c1ByZXZpZXdSb290KClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwiY29tcHRpcHN2aWV3XCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgVGlwc0NvbnRyb2xsZXIgPSByZXF1aXJlKFwidGlwc19jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gVGlwc0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb21wVGlwc1Jvb3QoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwiZXNlY3NpY2V2aWV3XCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgRXNlY3NpY2VDb250cm9sbGVyID0gcmVxdWlyZShcImVzZWNzaWNlX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRfcm9vdF93bmQgPSBFc2Vjc2ljZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRFc2Vjc2ljZVJvb3QoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJzdG9uZWR1bnZpZXdcIikge1xuICAgICAgICAgICAgICAgIHZhciBTdG9uZV9kdW5nZW9uQ29udHJvbGxlciA9IHJlcXVpcmUoXCJzdG9uZV9kdW5nZW9uX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRfcm9vdF93bmQgPSBTdG9uZV9kdW5nZW9uQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFN0b25lRHVuZ2VvblJvb3QoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJ2YXJpZXR5c3RvcmV2aWV3XCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgTWFsbENvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFsbF9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gTWFsbENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRWYXJpZXR5U3RvcmVSb290KClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwic2V2ZW5sb2dpbnZpZXdcIikge1xuICAgICAgICAgICAgICAgIHZhciBBY3Rpb25Db250cm9sbGVyID0gcmVxdWlyZShcImFjdGlvbl9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gQWN0aW9uQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFNldmVuTG9naW5Sb290KClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwid2VsZmFyZXZpZXdcIikge1xuICAgICAgICAgICAgICAgIHZhciBXZWxmYXJlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJ3ZWxmYXJlX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRfcm9vdF93bmQgPSBXZWxmYXJlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFdlbGZhcmVSb290KClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwidHJlYXN1cmV2aWV3XCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgQWN0aW9uQ29udHJvbGxlciA9IHJlcXVpcmUoXCJhY3Rpb25fY29udHJvbGxlclwiKTsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRfcm9vdF93bmQgPSBBY3Rpb25Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0VHJlYXN1cmVSb290KClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwidm95YWdldmlld1wiKSB7XG4gICAgICAgICAgICAgICAgdmFyIFZveWFnZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwidm95YWdlX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRfcm9vdF93bmQgPSBWb3lhZ2VDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Vm95YWdlTWFpblJvb3QoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJzdHJvbmdlcnZpZXdcIikge1xuICAgICAgICAgICAgICAgIHZhciBTdHJvbmdlckNvbnRyb2xsZXIgPSByZXF1aXJlKFwic3Ryb25nZXJfY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IFN0cm9uZ2VyQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFN0cm9uZ2VyUm9vdCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcInNlZXJwYWxhY2V2aWV3XCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgU2VlcnBhbGFjZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwic2VlcnBhbGFjZV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gU2VlcnBhbGFjZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRTZWVycGFsYWNlTWFpblJvb3QoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJ2b3lhZ2VkaXNwYXRjaHZpZXdcIikge1xuICAgICAgICAgICAgICAgIHZhciBWb3lhZ2VDb250cm9sbGVyID0gcmVxdWlyZShcInZveWFnZV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gVm95YWdlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFZveWFnZURpc3BhdGNoUm9vdCgpXG4gICAgICAgICAgICB9IFxuXG4gICAgICAgICAgICBpZiAodGhpcy50YXJnZXRfcm9vdF93bmQpIHsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVsYXkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlOZXh0R3VpZGUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGF5UGxheU5leHRHdWlkZSh0aGlzLmRlbGF5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGltZXJfaGFuZGVyKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVRpbWVyKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy50aW1lcl9oYW5kZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy50aW1lX251bSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfaGFuZGVyID0gdGhpcy5zdGFydFVwZGF0ZSgxMCwgdGhpcy5maW5kUm9vdFduZEJ5UGFyYW1zMi5iaW5kKHRoaXMpLCAxMDAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHRoaXMudGltZV9udW0rKztcbiAgICAgICAgICAgIGlmIChudW0gJiYgIG51bSA+PSA5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVUaW1lcigpXG4gICAgICAgICAgICAgICAgdGhpcy5lbmRQbGF5R3VpZGUodHJ1ZSk7ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSAgXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZmluZFJvb3RXbmRCeVBhcmFtczM6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMudGFyZ2V0X2RhdGEpIHJldHVybjtcbiAgICAgICAgdmFyIHJvb3RfbmFtZSA9IHRoaXMudGFyZ2V0X2RhdGFbMV07XG4gICAgICAgIHRoaXMuZGVsYXkgPSB0aGlzLnRhcmdldF9kYXRhWzJdO1xuICAgICAgICAvLyBuZXdmaXJzdHJlY2hhcmdlXG4gICAgICAgIGlmIChyb290X25hbWUgPT0gXCJmaXJzdHJlY2hhcmdlXCIpIHtcbiAgICAgICAgICAgIEFjdGlvbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRmlyc3RDaGFyZ2VWaWV3KHRydWUpXG4gICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwibmV3Zmlyc3RyZWNoYXJnZVwiIHx8IHJvb3RfbmFtZSA9PSBcImZpcnN0cmVjaGFyZ2UxXCIpIHtcbiAgICAgICAgICAgIHZhciBOZXdGaXJzdENoYXJnZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwibmV3Zmlyc3RjaGFyZ2VfY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgIE5ld0ZpcnN0Q2hhcmdlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5OZXdGaXJzdENoYXJnZVZpZXcodHJ1ZSlcbiAgICAgICAgfSBcblxuICAgICAgICBpZiAodGhpcy5kZWxheSA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXlOZXh0R3VpZGUoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZWxheVBsYXlOZXh0R3VpZGUodGhpcy5kZWxheSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgLy9kZXNjOuagueaNrjTkuKrlj4LmlbDmn6Xmib7lr7nosaEs5Li76KaB55So5LqO5Li75Zy65pmv55qE56e75Yqo6aG65L6/5Y+q5oOz5a+56LGh5Lul5Y+K5qOA5rWL56qX5L2T54q25oCBXG4gICAgLy90aW1lOjIwMTctMDgtMjEgMTA6MTQ6MzhcbiAgICAvL0ByZXR1cm4gXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIGZpbmRSb290V25kQnlQYXJhbXM0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRhcmdldF9kYXRhKSByZXR1cm47XG4gICAgICAgIHZhciByb290X25hbWUgPSB0aGlzLnRhcmdldF9kYXRhWzFdO1xuICAgICAgICB2YXIgdGFnZXRfaWQgPSB0aGlzLnRhcmdldF9kYXRhWzJdO1xuICAgICAgICB0aGlzLmRlbGF5ID0gdGhpcy50YXJnZXRfZGF0YVszXTtcbiAgICAgICAgaWYgKHJvb3RfbmFtZSA9PSBcImNlbnRlcmNpdHlcIikge1xuICAgICAgICAgICAgdmFyIE1haW5TY2VuZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFpbnNjZW5lX2NvbnRyb2xsZXJcIik7XG5cbiAgICAgICAgICAgIE1haW5TY2VuZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRDZW50ZXJDaXR5QnVpbGRCeUlkKHRhZ2V0X2lkLCBmdW5jdGlvbihidWlsZF9pdGVtKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJ1aWxkX2l0ZW0gJiYgYnVpbGRfaXRlbS5yb290X3duZCkge1xuICAgICAgICAgICAgICAgICAgICBNYWluU2NlbmVDb250cm9sbGVyLmdldEluc3RhbmNlKCkubW92ZVRvQnVpbGQodGFnZXRfaWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IGJ1aWxkX2l0ZW0ucm9vdF93bmQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlbGF5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxheU5leHRHdWlkZSgpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGF5UGxheU5leHRHdWlkZSh0aGlzLmRlbGF5KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRQbGF5R3VpZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBmaW5kVGFyZ2V0QnlQYXJhbXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy50YXJnZXRfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy50YXJnZXRfdHlwZSA9IHRoaXMudGFyZ2V0X2RhdGFbMF07ICAgICAgICAgICAgICAgIC8vIOaYr+agueaNruWQjeWtl+afpeaJvui/mOaYr+agueaNrnRhZ+afpeaJvlxuICAgICAgICAgICAgdGhpcy5kZWxheSA9IHRoaXMudGFyZ2V0X2RhdGFbMV0gfHwgMDsgICAgICAgICAgICAgICAgLy8g5aSE55CG5a6M5b2T5YmN5byV5a+85LmL5ZCOLOWIsOS4i+S4gOS4quW8leWvvOeahOmXtOmalOS6i+S7tlxuICAgICAgICAgICAgdGhpcy50YXJnZXRfbmFtZSA9IHRoaXMudGFyZ2V0X2RhdGFbMl07ICAgICAgICAgICAgICAgIC8vIOmcgOimgeafpeaJvueahOWvueixoeeahOagh+W/lyzlj6/og73mmK9uYW1l5oiW6ICFdGFnXG4gICAgICAgICAgICB2YXIgdGFyZ2V0X2NsaWNrYmFjayA9IHRoaXMudGFyZ2V0X2RhdGFbM10gfHwgMDsgICAgICAvLyDmmK/lkKbmmK/oh6rouqvngrnlh7vov5Tlm55cbiAgICAgICAgICAgIHRoaXMubmVlZF9zYXZlID0gdGhpcy50YXJnZXRfZGF0YVs0XSB8fCAwOyAgICAgICAgICAgIC8vIOWmguaenOmcgOimgeS/neWtmOeahOivnSzpgqPkuYjlsLHopoHphY3nva7ov5nkuKrmraXpqqTkuLoxLOWmguaenOaYrzLlsLHmmK/orrDlvZXoh6rlt7Es5bm25LiU6K6w5b2V5LiK5LiA5q2lLOWQjOaXtuWmguaenOi/meS4qumcgOimgeiusOW9lSzliJnkvJrot5/mnI3liqHlmajkuqTkupIs5LiA6Iis5piv5raI6ICX5p2Q5paZ55qE5q2l6aqkXG4gICAgICAgICAgICB0aGlzLmNsb3NlX2FsbCA9IHRoaXMudGFyZ2V0X2RhdGFbNV0gfHwgMDsgICAgICAgICAgICAvLyDmmK/lkKbpnIDopoHlhbPpl63miYDmnInnqpfkvZNcbiAgICAgICAgICAgIHRoaXMud2FpdF9kZWxheSA9IHRoaXMudGFyZ2V0X2RhdGFbNl0gfHwgMDsgICAgICAgICAgIC8vIOWmguaenOmFjee9ruS6huaXtumXtCzliJnooajnpLrov5nkuIDmraUs5LiN5piv6ZyA6KaB54K55Ye75aSE55CG55qELOiAjOaYr+etiei/meS4quaXtumXtOiHquWKqOS4i+S4gOatpVxuICAgICAgICAgICAgdGhpcy5zaG93X2d1aWRlX3N0ZXAgPSB0aGlzLnRhcmdldF9kYXRhWzddIHx8IHRydWU7ICAgLy8g5pyJ5LiA57G756qX5L2T5LiN6ZyA6KaB5pi+56S65Lmf5LiN6ZyA6KaB5pi+56S65omL5oyH5Yiw55qELOi/meS4quaXtuWAmeWwseeUqOi/meS4quWPguaVsOaOp+WItiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5maWdlcl9vZmZfeCA9IHRoaXMudGFyZ2V0X2RhdGFbOF0gfHwgMDsgICAgICAgICAgLy8g5byV5a+855qE5YGP56e7eFxuICAgICAgICAgICAgdGhpcy5maWdlcl9vZmZfeSA9IHRoaXMudGFyZ2V0X2RhdGFbOV0gfHwgMDsgICAgICAgICAgLy8g5byV5a+855qE5YGP56e7eVxuICAgICAgICAgICAgdGhpcy5ndWlkZV9tc2cgPSB0aGlzLnRhcmdldF9kYXRhWzEwXSB8fCBcIlwiOyAgICAgICAgICAvLyDlvJXlr7zmj4/ov7DmoYbnmoTlhoXlrrnmj4/ov7BcbiAgICAgICAgICAgIHRoaXMuc3ByaXRlX29mZl94ID0gdGhpcy50YXJnZXRfZGF0YVsxMV0gfHwgMDsgICAgICAgIC8vIOW8leWvvOaPj+i/sOahhueahOWBj+enu3hcbiAgICAgICAgICAgIHRoaXMuc3ByaXRlX29mZl95ID0gdGhpcy50YXJnZXRfZGF0YVsxMl0gfHwgMDsgICAgICAgIC8vIOW8leWvvOaPj+i/sOahhueahOWBj+enu3lcbiAgICAgICAgICAgIHRoaXMuc3ByaXRlX2ZsaXAgPSB0aGlzLnRhcmdldF9kYXRhWzEzXSB8fCAwOyAgICAgICAgIC8vIOW8leWvvOaPj+i/sOahhueahOe/u+i9rFxuXG4gICAgICAgICAgICB0aGlzLmJnX29wYWNpdHkgPSB0eXBlb2YgdGhpcy50YXJnZXRfZGF0YVsxNF0gPT0gXCJudW1iZXJcIiA/IHRoaXMudGFyZ2V0X2RhdGFbMTRdIDogMTAwO1xuXG4gICAgICAgICAgICAvLyB0aGlzLmJnX29wYWNpdHkgPSB0aGlzLnRhcmdldF9kYXRhWzE0XSB8fCAxMDA7ICAgICAgICAvLyDljovpu5Hog4zmma/pgI/mmI7luqZcblxuICAgICAgICAgICAgdGhpcy5zb3VuZF9uYW1lID0gdGhpcy50YXJnZXRfZGF0YVsxNV0gfHwgXCJcIjsgICAgICAgICAvLyDlvJXlr7zpn7PmlYhcblxuICAgICAgICAgICAgdGhpcy5maW5kVGFyZ2V0QnlSb290TkQoKTtcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIGZpbmRUYXJnZXRCeVJvb3RORDogZnVuY3Rpb24obnVtKSB7XG4gICAgICAgIGlmICh0aGlzLnRhcmdldF90eXBlID09IFwibmFtZVwiKSB7XG4gICAgICAgICAgICB2YXIgcmVhbF9uYW1lID0gR3VpZGVDb25zdC5Ob2RlS2V5c1t0aGlzLnRhcmdldF9uYW1lXTtcbiAgICAgICAgICAgIHZhciBuYW1lX2luZm8gPSBHdWlkZUNvbnN0LmdldE5hbWVJbmZvKHRoaXMudGFyZ2V0X25hbWUpO1xuXG4gICAgICAgICAgICBpZiAoIXJlYWxfbmFtZSlcbiAgICAgICAgICAgICAgICByZWFsX25hbWUgPSB0aGlzLnRhcmdldF9uYW1lO1xuXG4gICAgICAgICAgICBpZiAobmFtZV9pbmZvICYmIG5hbWVfaW5mby5sZW5ndGggPT0gMikge1xuICAgICAgICAgICAgICAgIGlmIChuYW1lX2luZm9bMF0gPT0gXCJ0YWdcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRoaXMuc2Vla0NoaWxkQnlUYWcodGhpcy50YXJnZXRfcm9vdF93bmQsIG5hbWVfaW5mb1sxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMudGFyZ2V0X3Jvb3Rfd25kLCByZWFsX25hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGFyZ2V0X3R5cGUgPT0gXCJ0YWdcIikge1xuICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0aGlzLnNlZWtDaGlsZEJ5VGFnKHRoaXMudGFyZ2V0X3Jvb3Rfd25kLCB0aGlzLnRhcmdldF9uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRhcmdldCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVUaW1lcigpO1xuICAgICAgICAgICAgdGhpcy5kcmF3VGFyZ2V0UmVjdCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMud2FpdF9kZWxheSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlX2hhbmRlciA9IHRoaXMudGFyZ2V0Lm9uY2UoY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0X2NvbmZpZylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tEb05leHRHdWlkZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dTa2lwQnRuKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICh0aGlzLmRlbGF5ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5hZGRUaWNrZXQodGhpcy5jaGVja0RvTmV4dEd1aWRlLmJpbmQodGhpcyksIHRoaXMuZGVsYXkpO1xuICAgICAgICAgICAgICAgICAgICAvLyB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLmNoZWNrRG9OZXh0R3VpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGF5UGxheU5leHRHdWlkZSh0aGlzLndhaXRfZGVsYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRpbWVyX2hhbmRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZV9udW0gPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMudGltZXJfaGFuZGVyID0gdGhpcy5zdGFydFVwZGF0ZSg2LCB0aGlzLmZpbmRUYXJnZXRCeVJvb3RORC5iaW5kKHRoaXMpLCAxMDAwKTsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobnVtICYmIG51bSA+PSA1KSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRpbWVyKCk7XG4gICAgICAgICAgICB0aGlzLmVuZFBsYXlHdWlkZSh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIHNhdmVHdWlkZVN0ZXA6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcub3Zlcl9zdGVwICYmIHRoaXMuY29uZmlnLm92ZXJfc3RlcCA9PSB0aGlzLmd1aWRlX3N0ZXApIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5ndWlkZV9jYWNoZV9kYXRhW3RoaXMuY29uZmlnLmlkXSlcbiAgICAgICAgICAgICAgICB0aGlzLmd1aWRlX2NhY2hlX2RhdGFbdGhpcy5jb25maWcuaWRdID0ge31cbiAgICAgICAgICAgIHRoaXMuZ3VpZGVfY2FjaGVfZGF0YVt0aGlzLmNvbmZpZy5pZF1bdGhpcy5jb25maWcub3Zlcl9zdGVwXSA9IHRydWU7XG4gICAgICAgICAgICB2YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpXG4gICAgICAgICAgICB2YXIgcm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNjLnN5cy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImd1aWRlX2RhdGFcIiArIHJvbGVfdm8uc3J2X2lkICsgcm9sZV92by5yaWQsIEpTT04uc3RyaW5naWZ5KHRoaXMuZ3VpZGVfY2FjaGVfZGF0YSkpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNsZWFyVGFyZ2V0SW5mbzogZnVuY3Rpb24oKSB7XG5cbiAgICB9LFxuXG4gICAgZW5kUGxheUd1aWRlOiBmdW5jdGlvbihpc19za2lwKSB7XG4gICAgICAgIGNjLmxvZyhcIue7k+adn+W9k+WJjeW8leWvvC0tLVwiICsgdGhpcy5hY3RfY29uZmlnLmlkKTtcbiAgICAgICAgdGhpcy5ndWlkZV9zdGVwID0gMDtcblxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWRlRXZlbnQuTmV3UGxheWVyR3VpZGVDbG9zZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzVGlja2V0KFwiZGVsYXlQbGF5TmV4dEd1aWRlXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmRlbFRpY2tlcihcImRlbGF5UGxheU5leHRHdWlkZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmN0cmwpXG4gICAgICAgICAgICB0aGlzLmN0cmwuc3RhcnRQbGF5R3VpZGUoZmFsc2UsIHRoaXMuYWN0X2NvbmZpZy5pZCwgaXNfc2tpcCk7XG5cbiAgICAgICAgaWYgKHRoaXMubW9kZWwpXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNldEd1aWRlTGFzdFBvcyhudWxsKTtcblxuICAgICAgICB0aGlzLmJhY2tncm91bmRfYmkuZW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuYWN0X2NvbmZpZyA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5oaWRlU0tpcEJ0bigpO1xuICAgIH0sXG5cbiAgICBmaW5kTm9kZUJ5TmFtZTogZnVuY3Rpb24oKSB7XG5cbiAgICB9LFxuXG4gICAgZmluZE5vZGVCeVRhZzogZnVuY3Rpb24oKSB7XG5cbiAgICB9LFxuXG4gICAgcmVtb3ZlVGltZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy50aW1lcl9oYW5kZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcFVwZGF0ZSh0aGlzLnRpbWVyX2hhbmRlcik7XG4gICAgICAgICAgICB0aGlzLnRpbWVfbnVtID0gMDtcbiAgICAgICAgICAgIHRoaXMudGltZXJfaGFuZGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBkcmF3VGFyZ2V0UmVjdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnRhcmdldCkge1xuICAgICAgICAgICAgdGhpcy5jbGlwX2Nvbl9uZC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lZmZlY3RfY29uX25kLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAvLyB0aGlzLmJhY2tncm91bmRfYmkuZW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICB2YXIgdGFyZ2V0X3Bvc18xID0gdGhpcy50YXJnZXQuY29udmVydFRvV29ybGRTcGFjZUFSKGNjLnYyKDAsIDApKTtcbiAgICAgICAgICAgIHZhciB0YXJnZXRfcG9zID0gdGhpcy5yb290X3duZC5jb252ZXJ0VG9Ob2RlU3BhY2VBUih0YXJnZXRfcG9zXzEpO1xuICAgICAgICAgICAgaWYgKHRhcmdldF9wb3MueSA8IHRhcmdldF9wb3NfMS55KVxuICAgICAgICAgICAgICAgIHRhcmdldF9wb3MueSA9IHRhcmdldF9wb3NfMS55O1xuICAgICAgICAgICAgdmFyIGZpbmFsX3Bvc1ggPSB0YXJnZXRfcG9zLnggKyAoMC41IC0gdGhpcy50YXJnZXQuYW5jaG9yWCkgKiB0aGlzLnRhcmdldC53aWR0aCArIHRoaXMuZmlnZXJfb2ZmX3ggfHwgMDtcbiAgICAgICAgICAgIHZhciBmaW5hbF9wb3NZID0gdGFyZ2V0X3Bvcy55ICsgKDAuNSAtIHRoaXMudGFyZ2V0LmFuY2hvclkpICogdGhpcy50YXJnZXQuaGVpZ2h0OyBcbiAgICAgICAgICAgIHZhciBmaW5hbF9wb3MgID0gY2MudjIoZmluYWxfcG9zWCwgZmluYWxfcG9zWSk7ICAgICAgICBcblxuICAgICAgICAgICAgdGhpcy5jbGlwX2Nvbl9uZC5wb3NpdGlvbiA9IGZpbmFsX3BvcztcbiAgICAgICAgICAgIHRoaXMuY2xpcF9jb25fbmQud2lkdGggPSB0aGlzLnRhcmdldC53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuY2xpcF9jb25fbmQuaGVpZ2h0ID0gdGhpcy50YXJnZXQuaGVpZ2h0O1xuICAgICAgICAgICAgLy8gdGhpcy5lZmZlY3RfY29uX25kLnBvc2l0aW9uID0gZmluYWxfcG9zO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5iZ19vcGFjaXR5ID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3VpZGVfY2xpcF9uZC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3VpZGVfY2xpcF9uZC5wb3NpdGlvbiA9IGZpbmFsX3BvcztcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmd1aWRlX2NsaXBfbmQud2lkdGggPSB0aGlzLnRhcmdldC53aWR0aDtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmd1aWRlX2NsaXBfbmQuaGVpZ2h0ID0gdGhpcy50YXJnZXQuaGVpZ2h0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmd1aWRlX2NsaXBfbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd19ndWlkZV9zdGVwKSB7ICAvLyDmmL7npLrmiYvmjIdcbiAgICAgICAgICAgICAgICB2YXIgbGFzdF9wb3MgPSB0aGlzLm1vZGVsLmdldEd1aWRlTGFzdFBvcygpO1xuXG4gICAgICAgICAgICAgICAgLy8g5pi+56S65omL5oyHXG4gICAgICAgICAgICAgICAgdmFyIGFjdGlvbl9uYW1lID0gUGxheWVyQWN0aW9uLmFjdGlvbl8xO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0X3BvcylcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uX25hbWUgPSBQbGF5ZXJBY3Rpb24uYWN0aW9uXzI7XG4gICAgICAgICAgICAgICAgdmFyIGVmZl9yZXMgPSBQYXRoVG9vbC5nZXRFZmZlY3RSZXMoMjQwKTtcbiAgICAgICAgICAgICAgICB2YXIgZWZmX3BhdGggPSBQYXRoVG9vbC5nZXRTcGluZVBhdGgoZWZmX3Jlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKGVmZl9wYXRoLCBmdW5jdGlvbihhY3Rpb25fbmFtZSwgZWZmX3NkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9zay5za2VsZXRvbkRhdGEgPSBlZmZfc2Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9zay5zZXRBbmltYXRpb24oMCwgYWN0aW9uX25hbWUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2tncm91bmRfYmkuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzLCBhY3Rpb25fbmFtZSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9uZC5zdG9wQWxsQWN0aW9ucygpXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RfcG9zKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtb3ZlX2RpcyA9IHRoaXMuY2FsRGlzdGFuY2goZmluYWxfcG9zLCBsYXN0X3Bvcyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0aW1lID0gbW92ZV9kaXMgLyAgR3VpZGVDb25zdC5GaW5nZXJfU3BlZWQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjYWxsX2Z1bmMgPSBjYy5jYWxsRnVuYyhmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpcF9tYXNrX2JsLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9zay5zZXRBbmltYXRpb24oMCwgUGxheWVyQWN0aW9uLmFjdGlvbl8xLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoX2FjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbW92ZV9hY3QgPSBjYy5tb3ZlVG8odGltZSwgZmluYWxfcG9zKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdF9xdWVxZSA9IGNjLnNlcXVlbmNlKG1vdmVfYWN0LCBjYWxsX2Z1bmMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQucnVuQWN0aW9uKGFjdF9xdWVxZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoX2FjdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9uZC5wb3NpdGlvbiA9IGZpbmFsX3BvcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ndWlkZV9tc2cgPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dOb3RpY2VDb250YWluZXIoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dMaXR0bGVTcGlyaXRBbmRUaXBzKGZpbmFsX3Bvcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dOb3RpY2VDb250YWluZXIoKSAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJhY2tncm91bmRfYmkuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDmmL7npLrlsI/nsr7ngbVcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2V0R3VpZGVMYXN0UG9zKGZpbmFsX3Bvcyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgb25DbGlja01hc2tCZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlICYmIHRoaXMuZWZmZWN0X2Nvbl9zay5za2VsZXRvbkRhdGEgJiYgdGhpcy5lZmZlY3RfY29uX3NrLmFuaW1hdGlvbiA9PSBcImFjdGlvbjFcIikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm5vdGljZV9lZmZlY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGljZV9lZmZlY3RfbmQgPSBuZXcgY2MuTm9kZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdF93bmQuYWRkQ2hpbGQodGhpcy5ub3RpY2VfZWZmZWN0X25kKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGljZV9lZmZlY3QgPSB0aGlzLm5vdGljZV9lZmZlY3RfbmQuYWRkQ29tcG9uZW50KHNwLlNrZWxldG9uKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGljZV9lZmZlY3Quc2V0RW5kTGlzdGVuZXIodGhpcy5ub3RpY2VBbmltYUVuZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGljZV9lZmZlY3RfbmQucG9zaXRpb24gPSB0aGlzLmVmZmVjdF9jb25fbmQucG9zaXRpb247ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHZhciBzcGluZV9yZXMgPSBQYXRoVG9vbC5nZXRFZmZlY3RSZXMoXCIxOThcIik7XG4gICAgICAgICAgICAgICAgdmFyIHNwaW5lX3BhdGggPSBQYXRoVG9vbC5nZXRTcGluZVBhdGgoc3BpbmVfcmVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMoc3BpbmVfcGF0aCwgZnVuY3Rpb24obm90aWNlX3NkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWNlX2VmZmVjdC5za2VsZXRvbkRhdGEgPSBub3RpY2Vfc2Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWNlX2VmZmVjdC5zZXRBbmltYXRpb24oMCwgXCJhY3Rpb25cIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWNlX2VmZmVjdF9uZC5wb3NpdGlvbiA9IHRoaXMuZWZmZWN0X2Nvbl9uZC5wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGljZV9lZmZlY3RfbmQuYWN0aXZlID0gdHJ1ZTsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm90aWNlX2VmZmVjdC5za2VsZXRvbkRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpY2VfZWZmZWN0LnNldEFuaW1hdGlvbigwLCBcImFjdGlvblwiLCBmYWxzZSk7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgbm90aWNlQW5pbWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLm5vdGljZV9lZmZlY3QuY2xlYXJUcmFja3MoKTtcbiAgICAgICAgdGhpcy5ub3RpY2VfZWZmZWN0X25kLmFjdGl2ZSA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICBvbkNsaWNrU2tpcEJ0bjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZW5kUGxheUd1aWRlKHRydWUpO1xuICAgIH0sXG5cbiAgICBjYWxEaXN0YW5jaDogZnVuY3Rpb24ocG9zMSwgcG9zMikge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KChwb3MxLnggLSBwb3MyLngpLCAyKSArIE1hdGgucG93KChwb3MxLnkgLSBwb3MyLnkpLCAyKSk7XG4gICAgfSxcblxuICAgIHNob3dOb3RpY2VDb250YWluZXI6IGZ1bmN0aW9uKCkge1xuXG4gICAgfSxcblxuICAgIHNob3dMaXR0bGVTcGlyaXRBbmRUaXBzOiBmdW5jdGlvbih0YXJfcG9zKSB7XG4gICAgICAgIHRoaXMubWFzX2Nvbl9uZC5hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMubXNnX3R4dF9ydC5zdHJpbmcgPSB0aGlzLmd1aWRlX21zZztcbiAgICAgICAgdGhpcy5tc2dfYmdfbmQuaGVpZ2h0ID0gdGhpcy5tc2dfdHh0X25kLmhlaWdodCArIDMwO1xuXG4gICAgICAgIHRoaXMudXBkYXRlR3VpZGVUaXBzQmdQb3ModGFyX3Bvcyk7XG4gICAgfSxcblxuICAgIHVwZGF0ZUd1aWRlVGlwc0JnUG9zOiBmdW5jdGlvbih0YXJfcG9zKSB7XG4gICAgICAgIHZhciBvcmlnaW5hbF9zaXplID0gdGhpcy5yb290X3duZC5nZXRDb250ZW50U2l6ZSgpO1xuICAgICAgICAvLyDnoa7lrpp455qE5YC8XG4gICAgICAgIHZhciBpc194X2ZpbHAgPSBmYWxzZTtcbiAgICAgICAgdmFyIGZpbmFsX3ggPSB0YXJfcG9zLng7XG4gICAgICAgIGlmICh0YXJfcG9zLnggPCBvcmlnaW5hbF9zaXplLndpZHRoICogMC41KSB7XG4gICAgICAgICAgICBpc194X2ZpbHAgPSBmYWxzZTtcbiAgICAgICAgICAgIGZpbmFsX3ggPSB0YXJfcG9zLnggKyB0aGlzLm1zZ19iZ19uZC53aWR0aCAqIDAuNTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlzX3hfZmlscCA9IHRydWU7XG4gICAgICAgICAgICBmaW5hbF94ID0gdGFyX3Bvcy54IC0gdGhpcy5tc2dfYmdfbmQud2lkdGggKiAwLjU7ICAgICAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyDnoa7lrppcbiAgICAgICAgdmFyIGlzX3lfZmlscCA9IGZhbHNlO1xuICAgICAgICB2YXIgZmluYWxfeSA9IHRhcl9wb3MueTtcbiAgICAgICAgaWYgKHRhcl9wb3MueSA8IG9yaWdpbmFsX3NpemUuaGVpZ2h0ICogMC41KSB7XG4gICAgICAgICAgICBpc195X2ZpbHAgPSBmYWxzZTtcbiAgICAgICAgICAgIGZpbmFsX3kgPSB0YXJfcG9zLnkgKyB0aGlzLmNsaXBfY29uX25kLmhlaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlzX3lfZmlscCA9IHRydWU7XG4gICAgICAgICAgICBmaW5hbF95ID0gdGFyX3Bvcy55IC0gdGhpcy5jbGlwX2Nvbl9uZC5oZWlnaHQ7ICAgXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNfeF9maWxwKSB7XG4gICAgICAgICAgICB0aGlzLm1zZ19iZ19uZC5zY2FsZVggPSAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubXNnX2JnX25kLnNjYWxlWCA9IDE7ICAgICAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNfeV9maWxwKSB7XG4gICAgICAgICAgICB0aGlzLm1zZ19iZ19uZC5zY2FsZVkgPSAtMTtcbiAgICAgICAgICAgIHRoaXMubXNnX2JnX25kLnkgKz0gMTA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1zZ19iZ19uZC5zY2FsZVkgPSAxOyAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5tc2dfYmdfbmQueSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1hc19jb25fbmQucG9zaXRpb24gPSBjYy52MihmaW5hbF94LCBmaW5hbF95KTtcbiAgICB9LFxuXG4gICAgc2hvd1NraXBCdG46IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5hY3RfY29uZmlnICYmIHRoaXMuYWN0X2NvbmZpZy5za2lwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNUaWNrZXQoXCJza2lwX2J0bl9zaG93XCIpKVxuICAgICAgICAgICAgICAgIHRoaXMuZGVsVGlja2VyKFwic2tpcF9idG5fc2hvd1wiKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNraXBfYnRuX25kLmFjdGl2ZSlcbiAgICAgICAgICAgICAgICB0aGlzLnNraXBfYnRuX25kLmFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICB0aGlzLmFkZFRpY2tldChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNraXBfYnRuX25kLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIGJ0bl9hY3QgPSB0aGlzLmdldFNraXBCdG5BY3QoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNraXBfYnRuX25kLnJ1bkFjdGlvbihidG5fYWN0KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgNSwgXCJza2lwX2J0bl9zaG93XCIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNraXBfYnRuX25kLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGhpZGVTS2lwQnRuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzVGlja2V0KFwic2tpcF9idG5fc2hvd1wiKSlcbiAgICAgICAgICAgIHRoaXMuZGVsVGlja2VyKFwic2tpcF9idG5fc2hvd1wiKTtcbiAgICAgICAgdGhpcy5za2lwX2J0bl9uZC5zdG9wQWxsQWN0aW9ucygpO1xuICAgICAgICB0aGlzLnNraXBfYnRuX25kLmFjdGl2ZSA9IGZhbHNlOyAgICAgICAgXG4gICAgfSxcblxuICAgIGdldFNraXBCdG5BY3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZmFkZWluID0gY2MuZmFkZUluKDAuNyk7XG4gICAgICAgIHZhciBmYWRlb3V0ID0gY2MuZmFkZU91dCgwLjQpO1xuICAgICAgICByZXR1cm4gY2MucmVwZWF0Rm9yZXZlcihjYy5zZXF1ZW5jZShmYWRlaW4sZmFkZW91dCkpXG4gICAgfSxcblxuICAgIGFkanVzdEd1aWRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xpcF9jb25fbmQuYWN0aXZlICYmIHRoaXMuZmluaXNoX2FjdGlvbikge1xuICAgICAgICAgICAgdmFyIHRhcmdldF9wb3MgPSB0aGlzLnRhcmdldC5jb252ZXJ0VG9Xb3JsZFNwYWNlQVIoY2MudjIoMCwgMCkpO1xuICAgICAgICAgICAgdGFyZ2V0X3BvcyA9IHRoaXMucm9vdF93bmQuY29udmVydFRvTm9kZVNwYWNlQVIodGFyZ2V0X3Bvcyk7XG4gICAgICAgICAgICB2YXIgZmluYWxfcG9zWCA9IHRhcmdldF9wb3MueCArICgwLjUgLSB0aGlzLnRhcmdldC5hbmNob3JYKSAqIHRoaXMudGFyZ2V0LndpZHRoICsgdGhpcy5maWdlcl9vZmZfeCB8fCAwO1xuICAgICAgICAgICAgdmFyIGZpbmFsX3Bvc1kgPSB0YXJnZXRfcG9zLnkgKyAoMC41IC0gdGhpcy50YXJnZXQuYW5jaG9yWSkgKiB0aGlzLnRhcmdldC5oZWlnaHQ7IFxuICAgICAgICAgICAgdmFyIGZpbmFsX3BvcyAgPSBjYy52MihmaW5hbF9wb3NYLCBmaW5hbF9wb3NZKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNsaXBfY29uX25kLnggIT09IGZpbmFsX3Bvcy54IHx8IHRoaXMuY2xpcF9jb25fbmQueSAhPT0gZmluYWxfcG9zLnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsaXBfY29uX25kLnggPSBmaW5hbF9wb3MueDtcbiAgICAgICAgICAgICAgICB0aGlzLmNsaXBfY29uX25kLnkgPSBmaW5hbF9wb3MueTsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVzZXRHdWlkZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNjLmxvZyhcIuaWree6v+mHjei/numHjeaWsOaJp+ihjOW8leWvvFwiKTtcbiAgICAgICAgLy8gVXRpbHMuY2xvc2VBbGxXaW5kb3coKTtcbiAgICAgICAgaWYgKCF0aGlzLmFjdF9jb25maWcpIHJldHVybjtcblxuICAgICAgICB2YXIgTWFpbnVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKTtcbiAgICAgICAgdmFyIE1haW51aUNvbnN0ID0gcmVxdWlyZShcIm1haW51aV9jb25zdFwiKTtcbiAgICAgICAgTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmNoYW5nZU1haW5VSVN0YXR1cyhNYWludWlDb25zdC5idG5faW5kZXgubWFpbl9zY2VuZSk7XG5cbiAgICAgICAgaWYgKHRoaXMudGltZXJfaGFuZGVyKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3BVcGRhdGUodGhpcy50aW1lcl9oYW5kZXIpO1xuICAgICAgICAgICAgdGhpcy50aW1lX251bSA9IDA7XG4gICAgICAgICAgICB0aGlzLnRpbWVyX2hhbmRlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNUaWNrZXQoXCJkZWxheVBsYXlOZXh0R3VpZGVcIikpXG4gICAgICAgICAgICB0aGlzLmRlbFRpY2tlcihcImRlbGF5UGxheU5leHRHdWlkZVwiKTtcblxuICAgICAgICB0aGlzLmhpZGVTS2lwQnRuKCk7XG5cblxuICAgICAgICBpZiAodGhpcy5ndWlkZV9jbGlwX25kLmFjdGl2ZSlcbiAgICAgICAgICAgIHRoaXMuZ3VpZGVfY2xpcF9uZC5hY3RpdmUgPSBmYWxzZTsgICAgICAgIFxuXG4gICAgICAgIGlmICh0aGlzLmNsaXBfY29uX25kLmFjdGl2ZSlcbiAgICAgICAgICAgIHRoaXMuY2xpcF9jb25fbmQuYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuZWZmZWN0X2Nvbl9uZC5hY3RpdmUpXG4gICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kX2JpLmVuYWJsZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5tYXNfY29uX25kLmFjdGl2ZSlcbiAgICAgICAgICAgIHRoaXMubWFzX2Nvbl9uZC5hY3RpdmUgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLndhaXRfc3RhdHVzX3RpbWVfdGlja2V0ID0gZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uKCl7ICAgXG5cbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsKVxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2V0R3VpZGVMYXN0UG9zKG51bGwpO1xuXG4gICAgICAgICAgICB0aGlzLnBsYXlHdWlkZSh0aGlzLmFjdF9jb25maWcpO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEwMDAsIDEpXG4gICAgfSxcblxuICAgIGRpc2Nvbm5lY3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmJhY2tncm91bmRfYmkuZW5hYmxlZCA9IHRydWU7ICAgICAgICBcbiAgICB9XG4gICAgXG59KSJdfQ==