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
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/guildboss/view/guildboss_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, '15aedZLqDpA/rPxanyKewrG', 'guildboss_main_window');
// Scripts/mod/guildboss/view/guildboss_main_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      公会boss主窗体
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var GuildBossController = require("guildboss_controller");
 
var GuildEvent = require("guild_event");
 
var PlayerHead = require("playerhead");
 
var BackpackController = require("backpack_controller");
 
var TimeTool = require("timetool");
 
var RoleController = require("role_controller");
 
var GuildbossEvent = require("guildboss_event");
 
var GuildBossConst = require("guildboss_const");
 
var BaseRole = require("baserole");
 
var HeroController = require("hero_controller");
 
var PartnerConst = require("partner_const");
 
var ActivityController = require("activity_controller");
 
var GuideEvent = require("guide_event");
 
var GuildBossMainWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("guildboss", "guildboss_main_window");
    this.win_type = WinType.Big;
    this.viewTag = SCENE_TAG.dialogue;
    this.ctrl = GuildBossController.getInstance();
    this.model = this.ctrl.getModel();
    this._doubleRewardList = {};
    this._currentPassNum = {};
    this._doublePassNum = {};
    this.item_pool = [];
    this.item_list = [];
    this.item_list_1 = {};
    this.item_list_2 = {};
    this.rank_list = {};
  },
  openCallBack: function openCallBack() {
    this.background = this.seekChild("background");
    this.background.scale = FIT_SCALE;
    var main_panel = this.seekChild("main_panel");
    this.close_btn = this.seekChild(main_panel, "close_btn");
    this.explain_btn = this.seekChild(main_panel, "explain_btn");
    this.add_btn = this.seekChild(main_panel, "add_btn");
    this.rank_btn = this.seekChild(main_panel, "rank_btn");
    this.challenge_btn = this.seekChild(main_panel, "challenge_btn");
    this.mopup_btn = this.seekChild(main_panel, "mopup_btn", cc.Button);
    this.challenge_btn_label = this.seekChild(this.challenge_btn, "label", cc.Label);
    this.challenge_btn_lo = this.seekChild(this.challenge_btn, "label", cc.LabelOutline);
    this.mopup_btn_label = this.seekChild(this.mopup_btn.node, "label", cc.Label);
    this.mopup_btn_lo = this.seekChild(this.mopup_btn.node, "label", cc.LabelOutline);
    this.challenge_btn_label.string = Utils.TI18N("挑战");
    this.mopup_btn_label.string = Utils.TI18N("扫荡"); //集结
 
    this.muster_btn = this.seekChild(main_panel, "muster_btn");
    this.muster_btn_tips = this.seekChild(this.muster_btn, "label", cc.Label);
    this.muster_btn_tips.string = "";
    this.musterImage = this.seekChild(main_panel, "musterImage"); // this.musterImage.x = this.muster_btn.x - 43;
 
    this.musterImage.active = false;
    this.muster_btn_label = this.seekChild(this.musterImage, "label", cc.Label);
    this._doubleReward = this.seekChild(main_panel, "doubleReward");
    this._doubleReward.active = false;
    this.reset_time_value = this.seekChild(main_panel, "reset_time_value", cc.RichText);
    this.challenge_times_value = this.seekChild(main_panel, "challenge_times_value", cc.Label);
    this.chapter_name = this.seekChild(main_panel, "chapter_name", cc.Label);
    this.chapter_boss_container = this.seekChild(main_panel, "chapter_boss_container");
 
    var Preview = require("guildboss_preview_window");
 
    this.guild_boss_view = new Preview();
    this.guild_boss_view.setParent(this.chapter_boss_container);
    this.guild_boss_view.show();
    this.buff_container = this.seekChild(main_panel, "buff_container");
    this.buff_name = this.seekChild(this.buff_container, "buff_name", cc.Label);
    this.buff_name.string = "";
    this.buff_icon = this.seekChild(this.buff_container, "buff_icon", cc.Sprite);
    this.buff_acitive_label = this.seekChild(this.buff_container, "buff_acitive_label", cc.RichText);
    this.remain_buy_lb = this.seekChild(main_panel, "remain_buy", cc.Label);
    this.rank_container = this.seekChild(main_panel, "rank_container");
    this.rank_info_btn = this.seekChild(this.rank_container, "rank_btn");
    this.rank_btn_label = this.seekChild(this.rank_btn, "label", cc.Label);
    this.bg = this.seekChild(main_panel, "bg", cc.Sprite);
    var object = {};
    object.container = this.seekChild(main_panel, "monster_container_1");
    object.model = this.seekChild(object.container, "monster_model");
    object.pass_icon = this.seekChild(object.container, "pass_icon");
    object.monster_name = this.seekChild(object.container, "monster_name", cc.Label);
    object.progress_container = this.seekChild(object.container, "progress_container");
    object.progress = this.seekChild(object.progress_container, "progress", cc.ProgressBar);
    object.hp_value = this.seekChild(object.progress_container, "hp_value", cc.Label);
    object.boss_icon = new PlayerHead();
    this.boss_icon = object.boss_icon;
    object.boss_icon.show();
    object.boss_icon.setPosition(-105, 133);
    object.boss_icon.setScale(0.55);
    object.boss_icon.setParent(object.container);
    this.monster_container = object;
    this.main_panel = main_panel;
  },
  registerEvent: function registerEvent() {
    this.role_vo = RoleController.getInstance().getRoleVo();
 
    if (this.role_vo != null) {
      if (this.role_assets_event == null) {
        this.role_assets_event = this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, value) {
          if (key == "position") {}
        }, this);
      }
    }
 
    this.muster_btn.on(cc.Node.EventType.TOUCH_END, function () {
      if (this.role_vo.position == 1 || this.role_vo.position == 2) {
        var str = Utils.TI18N("发出集结后将会提醒所有会友,且有1小时内不可再发出集结(全会),是否确定发出集结?");
 
        var fun = function () {
          this.ctrl.send21323();
        }.bind(this);
 
        var CommonAlert = require("commonalert");
 
        CommonAlert.show(str, Utils.TI18N("确定"), fun, Utils.TI18N("取消"), null, 1, null, null, 24);
      } else {
        message(Utils.TI18N("只有会长、副会长可发出集结"));
      }
    }, this);
    this.close_btn.on(cc.Node.EventType.TOUCH_END, function () {
      this.ctrl.openMainWindow(false);
    }, this);
    this.addGlobalEvent(GuildbossEvent.MusterCoolTime, function (data) {
      if (this.role_vo.position == 1 || this.role_vo.position == 2) {
        this.musterCoolCountTime(data);
      } else {
        this.muster_btn_tips.string = Utils.TI18N("集结号角");
      }
    }, this);
    this.addGlobalEvent(GuildbossEvent.BossActivityDoubleTime, function (data) {
      this.doubleTimeAction(data);
    }, this);
    this.buff_container.on(cc.Node.EventType.TOUCH_END, function () {
      this.checkBuff();
    }, this);
    this.background.on(cc.Node.EventType.TOUCH_END, function () {
      this.ctrl.openMainWindow(false);
    }, this);
    this.explain_btn.on(cc.Node.EventType.TOUCH_END, function (event) {
      Utils.playButtonSound(1);
      var pos = event.touch.getLocation();
 
      require("tips_controller").getInstance().showCommonTips(Config.guild_dun_data.data_const.game_rule.desc, pos);
    }, this);
    this.add_btn.on(cc.Node.EventType.TOUCH_END, function () {
      this.ctrl.requestBuyChallengeTimes(0);
    }, this);
    this.rank_btn.on(cc.Node.EventType.TOUCH_END, function () {
      var select_item;
 
      if (this.guild_boss_view) {
        select_item = this.guild_boss_view.getCurSelect();
      }
 
      if (select_item && select_item.data) {
        this.ctrl.openGuildBossRankWindow(true, select_item.data);
      }
    }, this);
    this.rank_info_btn.on(cc.Node.EventType.TOUCH_END, function () {
      var data = null;
 
      if (this.guild_boss_view) {
        data = this.guild_boss_view.getCurSelect();
      }
 
      require("rank_controller").getInstance().openRankView(true, require("rank_constant").RankType.union_boss, null, data);
    }, this);
    this.challenge_btn.on(cc.Node.EventType.TOUCH_END, function () {
      if (this.cur_selected_object && this.cur_selected_object.config && this.base_info) {
        if (this.base_info.count > 0) {
          HeroController.getInstance().openFormGoFightPanel(true, PartnerConst.Fun_Form.GuildDun_AD, {
            boss_id: this.cur_selected_object.config.boss_id
          });
        } else {
          this.ctrl.requestBuyChallengeTimes(1);
        }
      }
 
      gcore.GlobalEvent.fire(GuideEvent.TaskNextStep, "challenge_btn");
    }, this);
    this.mopup_btn.node.on("click", function () {
      if (this.cur_selected_object && this.cur_selected_object.config && this.base_info) {
        this.requestMopupMonster();
      }
    }, this); //更新面板基础信息
 
    this.addGlobalEvent(GuildbossEvent.UpdateGuildDunBaseInfo, function () {
      if (this.guild_boss_view) {
        this.guild_boss_view.updateScrollViewList();
      }
 
      this.updateDunBaseInfo();
    }, this);
    this.addGlobalEvent(GuildbossEvent.UpdateChangeStatus, function (data) {
      this.updateChangeStatus(data);
    }, this);
    this.addGlobalEvent(GuildbossEvent.UpdateGuildDunRank, function () {
      var rank_list = this.ctrl.getModel().getRaknRoleTopThreeList();
 
      if (rank_list && Utils.next(rank_list || {}) != null) {
        for (var i in rank_list) {
          var v = rank_list[i];
 
          if (!this.rank_list[i]) {
            var item = this.createSingleRankItem(i, v);
            this.rank_list[i] = item;
          }
 
          var item = this.rank_list[i];
 
          if (item) {
            item.label.string = v.name;
 
            if (v.all_dps) {
              item.value.string = "[" + Utils.getMoneyString(v.all_dps, false) + Utils.TI18N("伤害") + "]";
            } else {
              item.value.string = "";
            }
          }
        }
      }
    }, this); //更新当前剩余挑战次数
 
    this.addGlobalEvent(GuildbossEvent.UpdateGuildBossChallengeTimes, function (buy_type) {
      if (this.base_info != null) {
        this.challenge_times_value.string = this.base_info.count;
        this.remainBuyCount(this.base_info.buy_count);
      } else {
        var base_info = this.model.getBaseInfo();
 
        if (base_info != null) {
          this.remainBuyCount(base_info.buy_count);
          this.challenge_times_value.string = base_info.count;
        }
      } //挑战购买的时候自动打开挑战界面
 
 
      if (buy_type == 1) {
        this.autoOpenChallengeWindow();
      }
    }, this);
    this.addGlobalEvent(GuildEvent.UpdateGuildRedStatus, function (type, status) {
      this.updateSomeRedStatus(type, status);
    }, this);
  },
  checkBuff: function checkBuff() {
    if (this.base_info) {
      var item = gdata("guild_dun_data", "data_const", "buff_item").val;
      var num = BackpackController.getInstance().getModel().getBackPackItemNumByBid(item);
      var cost = gdata("guild_dun_data", "data_const", "buff_cost").val;
      var item_icon = Utils.getItemConfig(item).icon;
      var index_lev = Math.min(this.base_info.buff_lev + 1, Config.guild_dun_data.data_buff_data_length);
      var desc = gdata("guild_dun_data", "data_buff_data", [index_lev]).desc;
      var str = "";
      var str_ = "";
      var str_end = cc.js.formatStr(Utils.TI18N("<color=#764519>(激活后效果为</c><color=#289b14 ><size= 24>%s</></c><color=#764519>)</c>"), desc);
      var res = null;
 
      if (num > 0) {
        //如果存在道具
        if (this.base_info.buff_lev == 0) {
          //表示没buff
          str = cc.js.formatStr(Utils.TI18N("是否消耗<img src='%s' visible=true scale=0.5 /><color=#289b14 ><size= 24>%s</></c><color=#764519>(拥有:</c><color=#289b14><size=24>%s</></c><color=#764519>)激活全公会伤害提升Buff\n</c>"), item_icon, 1, num);
          str_ = str + str_end;
          res = PathTool.getItemRes(item_icon);
        } else {
          str = cc.js.formatStr(Utils.TI18N("是否消耗<img src='%s' visible=true scale=0.5 /><color=#289b14 ><size= 24>%s</></c><color=#764519>(拥有:</c><color=#289b14><size=24>%s</></c><color=#764519>)激活全公会伤害提升Buff\n</c>"), item_icon, 1, num);
          str_ = str + str_end;
          res = PathTool.getItemRes(item_icon);
        }
      } else {
        if (this.base_info.buff_lev == 0) {
          //表示没buff
          str = cc.js.formatStr(Utils.TI18N("是否消耗<img src='%s' visible=true scale=0.5 /><color=#289b14 ><size= 24>%s</></c><color=#764519>激活全公会伤害提升Buff\n</c>"), Config.item_data.data_assets_label2id.gold, cost);
          str_ = str + str_end;
          res = PathTool.getItemRes(Config.item_data.data_assets_label2id.gold);
        } else {
          str = cc.js.formatStr(Utils.TI18N("是否消耗<img src='%s' visible=true scale=0.5 /><color=#289b14 ><size= 24>%s</></c><color=#764519>激活全公会伤害提升Buff\n</c>"), Config.item_data.data_assets_label2id.gold, cost);
          str_ = str + str_end;
          res = PathTool.getItemRes(Config.item_data.data_assets_label2id.gold);
        }
      }
 
      var fun = function () {
        this.ctrl.send21305();
      }.bind(this);
 
      var CommonAlert = new require("commonalert");
      CommonAlert.show(str_, Utils.TI18N('确认'), fun, Utils.TI18N('取消'), null, 2, null, {
        resArr: [res]
      });
    }
  },
  updateMusterCoolTimeTicket: function updateMusterCoolTimeTicket() {
    this.remainTime = this.remainTime - 1;
 
    if (this.remainTime <= 0) {
      this.musterImage.active = false;
      this.muster_btn_tips.active = true;
      this.muster_btn_label.node.stopAllActions();
    }
 
    this.muster_btn_label.string = cc.js.formatStr(Utils.TI18N("%s\n后可集结"), TimeTool.getTimeFormat(this.remainTime));
  },
  musterCoolCountTime: function musterCoolCountTime(less_time) {
    if (!this.muster_btn_label) return;
    this.remainTime = less_time;
    this.muster_btn_label.node.stopAllActions();
 
    if (this.remainTime > 0) {
      this.musterImage.active = true;
      var self = this;
      this.muster_btn_label.node.runAction(cc.repeatForever(cc.sequence(cc.delayTime(1), cc.callFunc(function () {
        self.remainTime = self.remainTime - 1;
 
        if (self.remainTime <= 0) {
          self.musterImage.active = false;
          self.muster_btn_tips.active = true;
          self.muster_btn_label.node.stopAllActions();
        } else {
          self.musterImage.active = true;
          self.muster_btn_tips.active = false;
          self.muster_btn_label.string = cc.js.formatStr(Utils.TI18N("%s\n后可集结"), TimeTool.getTimeFormat(self.remainTime));
        }
      }))));
      this.updateMusterCoolTimeTicket();
    } else {
      this.musterImage.active = false;
      this.muster_btn_label.node.stopAllActions();
      this.muster_btn_tips.string = Utils.TI18N("集结号角");
    }
  },
  //切换Boss的时候
  updateChangeStatus: function updateChangeStatus(data) {
    if (!data) return;
    var fid = 0;
    var base_info = this.model.getBaseInfo();
    var object = this.monster_container;
    var hp_info = null;
 
    if (data.status == 0) {
      fid = base_info.fid;
 
      if (base_info != null && base_info.info != null) {
        //储存容器里面相关的boss模型
        for (var i in base_info.info) {
          var v = base_info.info[i];
          var boss_config = gdata("guild_dun_data", "data_guildboss_list", [v.boss_id]);
 
          if (boss_config) {
            if (object != null) {
              object.config = boss_config;
              hp_info = v;
            }
          }
        }
 
        if (base_info.combat_info) {
          for (var i in base_info.combat_info) {
            var v = base_info.combat_info[i];
 
            if (object && object.config && v.boss_id == object.config.boss_id) {
              object.dps = v.dps;
            }
          }
        }
      }
 
      this.buff_container.active = true;
    } else {
      fid = data.config.id;
      object.config = data.config;
      hp_info = {
        boss_id: data.config.boss_id,
        hp: 0
      };
      object.dps = 0;
      this.buff_container.active = false;
    }
 
    if (fid) {
      var chatpter_config = gdata("guild_dun_data", "data_chapter_reward", [fid]);
      var config = gdata("guild_dun_data", "data_guildboss_list", [chatpter_config.show_id]);
 
      if (chatpter_config != null) {
        this.chapter_name.string = chatpter_config.chapter_name + " " + chatpter_config.chapter_desc;
      }
 
      this.updateBg(config.bg_res);
    }
 
    if (hp_info) {
      this.updateMonsterHPStatus(object, hp_info);
    }
 
    if (object) {
      this.updateMonsterInfo(object); //更新模型
 
      this.updateSelectedBtnStatus();
    }
  },
  createSingleRankItem: function createSingleRankItem(i, data) {
    var container = {};
    var node = this.seekChild(this.rank_container, "rank_" + (Number(i) + 1));
    var label = this.seekChild(node, "label", cc.Label);
    var value = this.seekChild(node, "value", cc.Label);
    var sp = this.seekChild(node, "sp");
    container.node = node;
    container.label = label;
    container.value = value;
    container.sp = sp;
    return container;
  },
  requestMopupMonster: function requestMopupMonster() {
    if (this.base_info == null) return;
    var base_info = this.base_info;
 
    if (base_info.count > 0) {
      var msg = cc.js.formatStr(Utils.TI18N("确定按照上次挑战的伤害量<color=#249003>%s</c>扫荡一次吗?"), this.cur_selected_object.dps);
 
      var CommonAlert = require("commonalert");
 
      CommonAlert.show(msg, Utils.TI18N("确定"), function () {
        this.ctrl.requestMopupMonster(this.cur_selected_object.config.boss_id);
      }.bind(this), Utils.TI18N("取消"), null, 2);
    } else {
      var buy_next_num = base_info.buy_count + 1;
      var buy_config = gdata("guild_dun_data", "data_buy_count", [buy_next_num]);
 
      if (buy_config == null) {
        message(Utils.TI18N("当前没有扫荡次数,且购买次数已到达本日上限!"));
      } else {
        var role_vo = RoleController.getInstance().getRoleVo();
 
        if (role_vo) {
          if (role_vo.vip_lev < buy_config.vip_lev) {
            var msg = cc.js.formatStr(Utils.TI18N("挑战次数不足,提升至<color='#289b14'>vip%s</c>,可增加<color='#289b14'>1</c>点次数购买上限!"), buy_config.vip_lev);
 
            var CommonAlert = require("commonalert");
 
            CommonAlert.show(msg, Utils.TI18N("我要提升"), function () {
              require("vip_controller").getInstance().openVipMainWindow(true, VIPTABCONST.CHARGE);
            }.bind(this), Utils.TI18N("取消"), null, 2);
          } else {
            var cost = buy_config.expend;
            if (cost == null || cost.length < 2) return;
            var item_config = Utils.getItemConfig(cost[0]);
 
            if (item_config) {
              var msg = cc.js.formatStr(Utils.TI18N("挑战次数不足,是否花费 <img src='%s' scale=0.5 /> %s 购买<color=#289b14>1</c>点挑战次数并扫荡?\n(扫荡根据上次的伤害量<color=#249003>%s</c>进行结算)"), item_config.icon, cost[1], this.cur_selected_object.dps);
              var res = PathTool.getItemRes(item_config.icon);
 
              var CommonAlert = require("commonalert");
 
              CommonAlert.show(msg, Utils.TI18N("确定"), function () {
                this.ctrl.requestMopupMonster(this.cur_selected_object.config.boss_id);
              }.bind(this), Utils.TI18N("取消"), null, 2, null, {
                resArr: [res]
              });
            }
          }
        }
      }
    }
  },
  openRootWnd: function openRootWnd() {
    //基础信息,服务端要求没次打开面板的时候都请求一下
    this.ctrl.requestGuildDunBaseInfo();
    ActivityController.getInstance().setFirstComeGuild(false); //设置初始红点
 
    this.updateSomeRedStatus();
 
    if (ActivityController.getInstance().getBossActivityDoubleTime() == true) {
      this._doubleReward.active = true;
    }
  },
  //设置buff倒计时
  updateBuffTime: function updateBuffTime(time) {
    if (time && time) {
      this.buff_second = time;
 
      if (this.buff_second <= 0) {
        this.clearBuffTimeTicket();
      } else {
        if (this.buff_time_ticket == null) {
          this.buff_time_ticket = gcore.Timer.set(function () {
            this.updateBuffTimeTicket();
          }.bind(this), 1000, -1);
        }
      }
    }
  },
  clearBuffTimeTicket: function clearBuffTimeTicket() {
    if (this.buff_time_ticket != null) {
      gcore.Timer.del(this.buff_time_ticket);
      this.buff_time_ticket = null;
    }
  },
  updateBuffTimeTicket: function updateBuffTimeTicket() {
    this.buff_second = this.buff_second - 1;
 
    if (this.buff_second <= 0) {
      this.clearBuffTimeTicket();
    }
 
    this.buff_acitive_label.string = cc.js.formatStr(Utils.TI18N("<color=#35ff14>(%s后失效)</c>"), TimeTool.getTimeFormat(this.buff_second));
  },
  //挑战购买次数的时候自动打开面板
  autoOpenChallengeWindow: function autoOpenChallengeWindow() {
    if (this.cur_selected_object && this.cur_selected_object.config && this.base_info) {
      if (this.base_info.count > 0) {
        HeroController.getInstance().openFormGoFightPanel(true, PartnerConst.Fun_Form.GuildDun_AD, {
          boss_id: this.cur_selected_object.config.boss_id
        });
      }
    }
  },
  //协议返回用于更新基础信息
  updateDunBaseInfo: function updateDunBaseInfo() {
    this.base_info = this.model.getBaseInfo();
    var base_info = this.base_info;
 
    if (base_info != null && base_info.info != null) {
      this.remainBuyCount(base_info.buy_count); //储存容器里面相关的boss模型
 
      for (var i in base_info.info) {
        var v = base_info.info[i];
        var boss_config = gdata("guild_dun_data", "data_guildboss_list", [v.boss_id]);
 
        if (boss_config) {
          var object = this.monster_container;
 
          if (object != null) {
            object.config = boss_config; //更新血量
 
            this.updateMonsterHPStatus(object, v);
          }
        }
      } //存储dps
 
 
      if (base_info.combat_info) {
        for (var i in this.base_info.combat_info) {
          var v = this.base_info.combat_info[i];
 
          if (this.monster_container && this.monster_container.config && v.boss_id == this.monster_container.config.boss_id) {
            this.monster_container.dps = v.dps;
          }
        }
      } //设置基础信息显示
 
 
      this.challenge_times_value.string = base_info.count;
 
      if (this.cur_fid != base_info.fid) {
        this.cur_fid = base_info.fid;
        var chatpter_config = gdata("guild_dun_data", "data_chapter_reward", [base_info.fid]);
 
        if (chatpter_config != null) {
          if (this.monster_container && this.monster_container.boss_icon) {
            var config = gdata("guild_dun_data", "data_guildboss_list", [chatpter_config.show_id]);
 
            if (config) {
              this.monster_container.boss_icon.setHeadRes(config.head_icon);
              this.updateBg(config.bg_res);
            }
          }
 
          this.chapter_name.string = chatpter_config.chapter_name + " " + chatpter_config.chapter_desc; //这里设置挑战奖励吧
 
          this.updateFillRewardsItems(chatpter_config.dps_awrard, chatpter_config.award, chatpter_config.guild_exp);
        }
      } //延迟创建模型
 
 
      gcore.Timer.set(function () {
        this.updateMonsterInfo(this.monster_container);
      }.bind(this), 8 / 60, 1);
      this.selecetMonsterContainer();
 
      if (base_info != null && base_info.buff_end_time != 0) {
        var buff_config = gdata("guild_dun_data", "data_buff_data", [base_info.buff_lev]);
 
        if (buff_config) {
          this.buff_name.string = buff_config.desc; // this.buff_acitive_label.node.x = this.buff_name.node.width + this.buff_name.node.x + 10;
        }
 
        this.buff_icon.setState(cc.Sprite.State.NORMAL);
        this.buff_name.node.color = new cc.Color(137, 237, 255, 255);
        this.updateBuffTime(base_info.buff_end_time);
        this.buff_container.active = true;
      } else {
        this.buff_icon.setState(cc.Sprite.State.GRAY);
        this.buff_name.node.color = new cc.Color(cc.Color.WHITE);
        this.buff_name.string = gdata("guild_dun_data", "data_const", ["des_nobuff"]).desc; // this.buff_acitive_label.node.x = this.buff_name.node.width + this.buff_name.node.x + 10;
 
        this.buff_acitive_label.string = Utils.TI18N("<color=#ff5858>(未激活)</c>");
      }
    }
  },
  //剩余购买次数
  remainBuyCount: function remainBuyCount(count) {
    count = count || 0;
    var num = 0;
    var length = Config.guild_dun_data.data_buy_count_length;
    var buy_config = Config.guild_dun_data.data_buy_count[length];
 
    if (buy_config) {
      num = buy_config.count - count;
    }
 
    this.remain_buy_lb.string = num;
  },
  updateBg: function updateBg(image) {
    var res_id = PathTool.getBigBg(image, null, "guildboss");
 
    if (this.res_id != res_id) {
      this.res_id = res_id;
      this.loadRes(this.res_id, function (sf_obj) {
        this.bg.spriteFrame = sf_obj;
      }.bind(this));
    }
  },
  //创建模型,根据config
  updateMonsterInfo: function updateMonsterInfo(object) {
    if (object == null || object.config == null) return;
    var config = object.config; //怪物模型方面,只有id不同才做处理
 
    if (object.boss_id != config.boss_id) {
      object.boss_id = config.boss_id;
      object.monster_name.string = config.item_name; //清除掉之前的模型
 
      if (object.spine) {
        // object.spine.deleteMe();
        // object.spine = null;
        object.spine.setData(BaseRole.type.unit, config.combat_id, PlayerAction.show, true);
      } else {
        object.spine = new BaseRole();
        object.spine.setParent(object.model);
        object.spine.setData(BaseRole.type.unit, config.combat_id, PlayerAction.show, true);
      }
    }
  },
  //选中指定的怪物节点
  selecetMonsterContainer: function selecetMonsterContainer(type) {
    this.cur_selected_object = this.monster_container; // var protocal = {
    //     boss_id: this.cur_selected_object.config.boss_id,
    //     start_num: 1,
    //     end_num: 3
    // }
    // this.ctrl.requestGuildDunRank(GuildBossConst.rank.role, protocal)
 
    this.updateSelectedBtnStatus();
  },
  //更新选中对象的按钮状态
  updateSelectedBtnStatus: function updateSelectedBtnStatus() {
    if (this.cur_selected_object == null) return;
    if (this.cur_selected_object.hp == null || this.cur_selected_object.dps == null) return;
 
    if (this.cur_selected_object.hp == 0) {
      //已经被击杀了
      Utils.setGreyButton(this.challenge_btn, true);
      Utils.setGreyButton(this.mopup_btn, true);
      this.challenge_btn_lo.enabled = false;
      this.mopup_btn_lo.enabled = false;
    } else {
      if (this.cur_selected_object.dps == 0) {
        //没有挑战过,不可以扫荡
        Utils.setGreyButton(this.mopup_btn, true);
        Utils.setGreyButton(this.challenge_btn, false);
        this.challenge_btn_lo.enabled = true;
        this.mopup_btn_lo.enabled = false;
      } else {
        Utils.setGreyButton(this.challenge_btn, false);
        Utils.setGreyButton(this.mopup_btn, false);
        this.challenge_btn_lo.enabled = true;
        this.mopup_btn_lo.enabled = true;
      }
    }
  },
  //更新血条
  updateMonsterHPStatus: function updateMonsterHPStatus(object, info) {
    if (object == null || info == null || object.config == null) return;
 
    if (info.hp <= 0) {
      this.doubleTimeAction(false);
    } else {
      if (ActivityController.getInstance().getBossActivityDoubleTime() == true) this.doubleTimeAction(true);
    } //设置血量
 
 
    var config = object.config;
    var percent = Math.ceil(100 * info.hp / config.hp);
    object.hp_value.string = percent + "%";
    object.progress.progress = percent / 100;
    object.hp = info.hp;
    object.pass_icon.active = info.hp == 0;
    object.boss_icon.setVisible(info.hp != 0);
    object.monster_name.node.active = info.hp != 0;
    object.progress_container.active = info.hp != 0;
  },
  doubleTimeAction: function doubleTimeAction(bool) {
    if (bool == false) {
      this._doubleReward.stopAllActions();
 
      if (Utils.next(this._doubleRewardList) != null) {
        for (var i in this._doubleReward) {
          var v = this._doubleReward[i]; // v.setSpecialColor();
          // v.setSpecialNum(this._currentPassNum[i]);
          // v.setDoubleIcon(false);
        }
      }
    }
 
    this._doubleReward.active = bool;
    var seq = cc.sequence(cc.fadeOut(1.0), cc.fadeIn(1.0), cc.delayTime(0.3));
 
    this._doubleReward.runAction(cc.repeatForever(seq));
 
    if (Utils.next(this._doubleRewardList) != null) {
      for (var i in this._doubleRewardList) {
        var v = this._doubleRewardList[i]; // v.setSpecialColor(true);
        // v.setSpecialNum(this._doublePassNum[i]);
        // v.setDoubleIcon(true);
      }
    }
  },
  //设置物品奖励
  //dps_award:伤害奖励列表
  //fixed_award:固定奖励列表
  //guild_award:公会贡献特殊
  updateFillRewardsItems: function updateFillRewardsItems(dps_award, fixed_award, guild_award) {
    dps_award = dps_award || {};
    _fixed_award = fixed_award || [];
 
    var _fixed_award = Utils.deepCopy(fixed_award);
 
    guild_award = guild_award || 0;
 
    _fixed_award.push([gdata("item_data", "data_assets_label2id", "guild_exp"), guild_award]); // for (var i in this.item_list) {
    //     var item = this.item_list[i];
    //     item.setVisible(false);
    //     this.item_pool.push(item);
    // }
    // this.item_list = [];
 
 
    for (var i in this.item_list_1) {
      var item = this.item_list_1[i];
 
      if (item) {
        item.setVisible(false);
      }
    }
 
    for (var i in this.item_list_2) {
      var item = this.item_list_2[i];
 
      if (item) {
        item.setVisible(false);
      }
    }
 
    var item_config = null;
    var index = 1; // var backpack_item = null;
 
    var _x = 0;
 
    var _y = -339;
 
    var scale = 0.8;
    var desc = null; //设置伤害奖励
 
    for (var i in dps_award) {
      var v = dps_award[i];
 
      if (this.item_list_1[index] == null) {
        var _backpack_item = ItemsPool.getInstance().getItem("backpack_item");
 
        _backpack_item.initConfig(false, scale, false, true);
 
        _backpack_item.setParent(this.main_panel);
 
        _backpack_item.show();
 
        this.item_list_1[index] = _backpack_item;
      }
 
      var backpack_item = this.item_list_1[index]; // backpack_item = this.item_pool.shift();
 
      backpack_item.setVisible(true);
      _x = 100 + (index - 1) * (BackPackItem.Width * scale + 14) + BackPackItem.Width * scale * 0.5 - 335; // backpack_item.setDefaultTip();
 
      backpack_item.setPosition(_x, _y);
      backpack_item.setData({
        bid: v[0],
        num: v[1]
      });
 
      if (v[1] >= 1000) {
        desc = cc.js.formatStr("%sK", Math.floor(v[1] * 0.001));
      } else {
        desc = v[1];
      }
 
      if (v[2]) {
        desc = desc;
      } // backpack_item.setSpecialNum(desc);
      // backpack_item.setSpecialColor();
 
 
      this._currentPassNum[i] = desc;
 
      if (!this._doubleRewardList[i]) {
        this._doubleRewardList[i] = backpack_item;
        var doubleDesc = null;
 
        if (v[1] * 2 >= 1000) {
          doubleDesc = cc.js.formatStr("%sK", Math.floor(v[1] * 2 * 0.001));
        } else {
          doubleDesc = v[1] * 2;
        }
 
        if (v[2]) {
          doubleDesc = doubleDesc;
        }
 
        this._doublePassNum[i] = doubleDesc;
      } // this.item_list.push(backpack_item);
 
 
      index = index + 1;
    }
 
    if (ActivityController.getInstance().getBossActivityDoubleTime() == true) {
      this.doubleTimeAction(true);
    } //设置击杀奖励
 
 
    index = 1; // backpack_item = null;
 
    for (var i in _fixed_award) {
      var v = _fixed_award[i];
 
      if (v instanceof Array && v[0] && v[1]) {
        if (this.item_list_2[index] == null) {
          var _backpack_item2 = ItemsPool.getInstance().getItem("backpack_item");
 
          _backpack_item2.initConfig(false, scale, false, true);
 
          _backpack_item2.setParent(this.main_panel);
 
          _backpack_item2.show();
 
          this.item_list_2[index] = _backpack_item2;
        }
 
        var backpack_item = this.item_list_2[index]; // backpack_item = this.item_pool.shift();
 
        backpack_item.setVisible(true);
        _x = 100 + (index - 1) * (BackPackItem.Width * scale + 14) + BackPackItem.Width * scale * 0.5 - 23; // backpack_item.setDefaultTip();
 
        backpack_item.setPosition(_x, _y);
        backpack_item.setData({
          bid: v[0],
          num: v[1]
        });
        this.item_list.push(backpack_item);
        index = index + 1;
      }
    }
  },
  //更新红点
  updateSomeRedStatus: function updateSomeRedStatus(type, status) {},
  getType: function getType(index) {
    if (index == 1) {
      return GuildBossConst.type.physics;
    } else {
      return GuildBossConst.type.magic;
    }
  },
  closeCallBack: function closeCallBack() {
    if (this.boss_icon) {
      this.boss_icon.deleteMe();
      this.boss_icon = null;
    }
 
    if (this._doubleRewardList) {
      for (var i in this._doubleRewardList) {
        var v = this._doubleRewardList[i];
 
        if (v.deleteMe) {
          v.deleteMe();
          v = null;
        }
      }
 
      this._doubleRewardList = null;
    } // this.clearTimeTicket();
 
 
    this.clearBuffTimeTicket();
 
    if (this.monster_list) {
      for (var i in this.monster_list) {
        var v = this.monster_list[i];
 
        if (v.spine) {
          v.spine.deleteMe();
          v.spine = null;
        }
      }
 
      this.monster_list = null;
    } // if (this.item_list) {
    //     for (var i in this.item_list) {
    //         var v = this.item_list[i];
    //         if (v.deleteMe) {
    //             v.deleteMe();
    //             v = null;
    //         }
    //     }
    //     this.item_list = null;
    // }
    // for (var i in this.item_pool) {
    //     this.item_pool[i].deleteMe();
    //     this.item_pool[i] = null;
    // }
    // this.item_pool = null;
 
 
    if (this.item_list_2) {
      for (var i in this.item_list_2) {
        if (this.item_list_2[i]) {
          this.item_list_2[i].deleteMe();
          this.item_list_2[i] = null;
        }
      }
 
      this.item_list_2 = null;
    } // if (this.item_list_1) {
    //     for (var i in this.item_list_1) {
    //         if (this.item_list_1[i]) {
    //             this.item_list_1[i].deleteMe();
    //             this.item_list_1[i] = null;
    //         }
    //     }
    //     this.item_list_1 = null;
    // }
 
 
    this.muster_btn_label.node.stopAllActions();
 
    if (this.guild_boss_view) {
      this.guild_boss_view.deleteMe();
      this.guild_boss_view = null;
    }
 
    if (this.role_vo != null) {
      if (this.role_assets_event != null) {
        this.role_vo.unbind(this.role_assets_event);
        this.role_assets_event = null;
      }
 
      this.role_vo = null;
    }
 
    this.ctrl.openMainWindow(false);
  }
});
module.exports = GuildBossMainWindow;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlsZGJvc3NcXHZpZXdcXGd1aWxkYm9zc19tYWluX3dpbmRvdy5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJHdWlsZEJvc3NDb250cm9sbGVyIiwiR3VpbGRFdmVudCIsIlBsYXllckhlYWQiLCJCYWNrcGFja0NvbnRyb2xsZXIiLCJUaW1lVG9vbCIsIlJvbGVDb250cm9sbGVyIiwiR3VpbGRib3NzRXZlbnQiLCJHdWlsZEJvc3NDb25zdCIsIkJhc2VSb2xlIiwiSGVyb0NvbnRyb2xsZXIiLCJQYXJ0bmVyQ29uc3QiLCJBY3Rpdml0eUNvbnRyb2xsZXIiLCJHdWlkZUV2ZW50IiwiR3VpbGRCb3NzTWFpbldpbmRvdyIsImNjIiwiQ2xhc3MiLCJCYXNlVmlldyIsImN0b3IiLCJwcmVmYWJQYXRoIiwiZ2V0UHJlZmFiUGF0aCIsIndpbl90eXBlIiwiV2luVHlwZSIsIkJpZyIsInZpZXdUYWciLCJTQ0VORV9UQUciLCJkaWFsb2d1ZSIsImN0cmwiLCJnZXRJbnN0YW5jZSIsIm1vZGVsIiwiZ2V0TW9kZWwiLCJfZG91YmxlUmV3YXJkTGlzdCIsIl9jdXJyZW50UGFzc051bSIsIl9kb3VibGVQYXNzTnVtIiwiaXRlbV9wb29sIiwiaXRlbV9saXN0IiwiaXRlbV9saXN0XzEiLCJpdGVtX2xpc3RfMiIsInJhbmtfbGlzdCIsIm9wZW5DYWxsQmFjayIsImJhY2tncm91bmQiLCJzZWVrQ2hpbGQiLCJzY2FsZSIsIkZJVF9TQ0FMRSIsIm1haW5fcGFuZWwiLCJjbG9zZV9idG4iLCJleHBsYWluX2J0biIsImFkZF9idG4iLCJyYW5rX2J0biIsImNoYWxsZW5nZV9idG4iLCJtb3B1cF9idG4iLCJCdXR0b24iLCJjaGFsbGVuZ2VfYnRuX2xhYmVsIiwiTGFiZWwiLCJjaGFsbGVuZ2VfYnRuX2xvIiwiTGFiZWxPdXRsaW5lIiwibW9wdXBfYnRuX2xhYmVsIiwibm9kZSIsIm1vcHVwX2J0bl9sbyIsInN0cmluZyIsIlV0aWxzIiwiVEkxOE4iLCJtdXN0ZXJfYnRuIiwibXVzdGVyX2J0bl90aXBzIiwibXVzdGVySW1hZ2UiLCJhY3RpdmUiLCJtdXN0ZXJfYnRuX2xhYmVsIiwiX2RvdWJsZVJld2FyZCIsInJlc2V0X3RpbWVfdmFsdWUiLCJSaWNoVGV4dCIsImNoYWxsZW5nZV90aW1lc192YWx1ZSIsImNoYXB0ZXJfbmFtZSIsImNoYXB0ZXJfYm9zc19jb250YWluZXIiLCJQcmV2aWV3IiwiZ3VpbGRfYm9zc192aWV3Iiwic2V0UGFyZW50Iiwic2hvdyIsImJ1ZmZfY29udGFpbmVyIiwiYnVmZl9uYW1lIiwiYnVmZl9pY29uIiwiU3ByaXRlIiwiYnVmZl9hY2l0aXZlX2xhYmVsIiwicmVtYWluX2J1eV9sYiIsInJhbmtfY29udGFpbmVyIiwicmFua19pbmZvX2J0biIsInJhbmtfYnRuX2xhYmVsIiwiYmciLCJvYmplY3QiLCJjb250YWluZXIiLCJwYXNzX2ljb24iLCJtb25zdGVyX25hbWUiLCJwcm9ncmVzc19jb250YWluZXIiLCJwcm9ncmVzcyIsIlByb2dyZXNzQmFyIiwiaHBfdmFsdWUiLCJib3NzX2ljb24iLCJzZXRQb3NpdGlvbiIsInNldFNjYWxlIiwibW9uc3Rlcl9jb250YWluZXIiLCJyZWdpc3RlckV2ZW50Iiwicm9sZV92byIsImdldFJvbGVWbyIsInJvbGVfYXNzZXRzX2V2ZW50IiwiYmluZCIsIkV2ZW50SWQiLCJVUERBVEVfUk9MRV9BVFRSSUJVVEUiLCJrZXkiLCJ2YWx1ZSIsIm9uIiwiTm9kZSIsIkV2ZW50VHlwZSIsIlRPVUNIX0VORCIsInBvc2l0aW9uIiwic3RyIiwiZnVuIiwic2VuZDIxMzIzIiwiQ29tbW9uQWxlcnQiLCJtZXNzYWdlIiwib3Blbk1haW5XaW5kb3ciLCJhZGRHbG9iYWxFdmVudCIsIk11c3RlckNvb2xUaW1lIiwiZGF0YSIsIm11c3RlckNvb2xDb3VudFRpbWUiLCJCb3NzQWN0aXZpdHlEb3VibGVUaW1lIiwiZG91YmxlVGltZUFjdGlvbiIsImNoZWNrQnVmZiIsImV2ZW50IiwicGxheUJ1dHRvblNvdW5kIiwicG9zIiwidG91Y2giLCJnZXRMb2NhdGlvbiIsInNob3dDb21tb25UaXBzIiwiQ29uZmlnIiwiZ3VpbGRfZHVuX2RhdGEiLCJkYXRhX2NvbnN0IiwiZ2FtZV9ydWxlIiwiZGVzYyIsInJlcXVlc3RCdXlDaGFsbGVuZ2VUaW1lcyIsInNlbGVjdF9pdGVtIiwiZ2V0Q3VyU2VsZWN0Iiwib3Blbkd1aWxkQm9zc1JhbmtXaW5kb3ciLCJvcGVuUmFua1ZpZXciLCJSYW5rVHlwZSIsInVuaW9uX2Jvc3MiLCJjdXJfc2VsZWN0ZWRfb2JqZWN0IiwiY29uZmlnIiwiYmFzZV9pbmZvIiwiY291bnQiLCJvcGVuRm9ybUdvRmlnaHRQYW5lbCIsIkZ1bl9Gb3JtIiwiR3VpbGREdW5fQUQiLCJib3NzX2lkIiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImZpcmUiLCJUYXNrTmV4dFN0ZXAiLCJyZXF1ZXN0TW9wdXBNb25zdGVyIiwiVXBkYXRlR3VpbGREdW5CYXNlSW5mbyIsInVwZGF0ZVNjcm9sbFZpZXdMaXN0IiwidXBkYXRlRHVuQmFzZUluZm8iLCJVcGRhdGVDaGFuZ2VTdGF0dXMiLCJ1cGRhdGVDaGFuZ2VTdGF0dXMiLCJVcGRhdGVHdWlsZER1blJhbmsiLCJnZXRSYWtuUm9sZVRvcFRocmVlTGlzdCIsIm5leHQiLCJpIiwidiIsIml0ZW0iLCJjcmVhdGVTaW5nbGVSYW5rSXRlbSIsImxhYmVsIiwibmFtZSIsImFsbF9kcHMiLCJnZXRNb25leVN0cmluZyIsIlVwZGF0ZUd1aWxkQm9zc0NoYWxsZW5nZVRpbWVzIiwiYnV5X3R5cGUiLCJyZW1haW5CdXlDb3VudCIsImJ1eV9jb3VudCIsImdldEJhc2VJbmZvIiwiYXV0b09wZW5DaGFsbGVuZ2VXaW5kb3ciLCJVcGRhdGVHdWlsZFJlZFN0YXR1cyIsInR5cGUiLCJzdGF0dXMiLCJ1cGRhdGVTb21lUmVkU3RhdHVzIiwiZ2RhdGEiLCJ2YWwiLCJudW0iLCJnZXRCYWNrUGFja0l0ZW1OdW1CeUJpZCIsImNvc3QiLCJpdGVtX2ljb24iLCJnZXRJdGVtQ29uZmlnIiwiaWNvbiIsImluZGV4X2xldiIsIk1hdGgiLCJtaW4iLCJidWZmX2xldiIsImRhdGFfYnVmZl9kYXRhX2xlbmd0aCIsInN0cl8iLCJzdHJfZW5kIiwianMiLCJmb3JtYXRTdHIiLCJyZXMiLCJnZXRJdGVtUmVzIiwiaXRlbV9kYXRhIiwiZGF0YV9hc3NldHNfbGFiZWwyaWQiLCJnb2xkIiwic2VuZDIxMzA1IiwicmVzQXJyIiwidXBkYXRlTXVzdGVyQ29vbFRpbWVUaWNrZXQiLCJyZW1haW5UaW1lIiwic3RvcEFsbEFjdGlvbnMiLCJnZXRUaW1lRm9ybWF0IiwibGVzc190aW1lIiwic2VsZiIsInJ1bkFjdGlvbiIsInJlcGVhdEZvcmV2ZXIiLCJzZXF1ZW5jZSIsImRlbGF5VGltZSIsImNhbGxGdW5jIiwiZmlkIiwiaHBfaW5mbyIsImluZm8iLCJib3NzX2NvbmZpZyIsImNvbWJhdF9pbmZvIiwiZHBzIiwiaWQiLCJocCIsImNoYXRwdGVyX2NvbmZpZyIsInNob3dfaWQiLCJjaGFwdGVyX2Rlc2MiLCJ1cGRhdGVCZyIsImJnX3JlcyIsInVwZGF0ZU1vbnN0ZXJIUFN0YXR1cyIsInVwZGF0ZU1vbnN0ZXJJbmZvIiwidXBkYXRlU2VsZWN0ZWRCdG5TdGF0dXMiLCJOdW1iZXIiLCJzcCIsIm1zZyIsImJ1eV9uZXh0X251bSIsImJ1eV9jb25maWciLCJ2aXBfbGV2Iiwib3BlblZpcE1haW5XaW5kb3ciLCJWSVBUQUJDT05TVCIsIkNIQVJHRSIsImV4cGVuZCIsImxlbmd0aCIsIml0ZW1fY29uZmlnIiwib3BlblJvb3RXbmQiLCJyZXF1ZXN0R3VpbGREdW5CYXNlSW5mbyIsInNldEZpcnN0Q29tZUd1aWxkIiwiZ2V0Qm9zc0FjdGl2aXR5RG91YmxlVGltZSIsInVwZGF0ZUJ1ZmZUaW1lIiwidGltZSIsImJ1ZmZfc2Vjb25kIiwiY2xlYXJCdWZmVGltZVRpY2tldCIsImJ1ZmZfdGltZV90aWNrZXQiLCJUaW1lciIsInNldCIsInVwZGF0ZUJ1ZmZUaW1lVGlja2V0IiwiZGVsIiwiY3VyX2ZpZCIsInNldEhlYWRSZXMiLCJoZWFkX2ljb24iLCJ1cGRhdGVGaWxsUmV3YXJkc0l0ZW1zIiwiZHBzX2F3cmFyZCIsImF3YXJkIiwiZ3VpbGRfZXhwIiwic2VsZWNldE1vbnN0ZXJDb250YWluZXIiLCJidWZmX2VuZF90aW1lIiwiYnVmZl9jb25maWciLCJzZXRTdGF0ZSIsIlN0YXRlIiwiTk9STUFMIiwiY29sb3IiLCJDb2xvciIsIkdSQVkiLCJXSElURSIsImRhdGFfYnV5X2NvdW50X2xlbmd0aCIsImRhdGFfYnV5X2NvdW50IiwiaW1hZ2UiLCJyZXNfaWQiLCJnZXRCaWdCZyIsImxvYWRSZXMiLCJzZl9vYmoiLCJzcHJpdGVGcmFtZSIsIml0ZW1fbmFtZSIsInNwaW5lIiwic2V0RGF0YSIsInVuaXQiLCJjb21iYXRfaWQiLCJQbGF5ZXJBY3Rpb24iLCJzZXRHcmV5QnV0dG9uIiwiZW5hYmxlZCIsInBlcmNlbnQiLCJjZWlsIiwic2V0VmlzaWJsZSIsImJvb2wiLCJzZXEiLCJmYWRlT3V0IiwiZmFkZUluIiwiZHBzX2F3YXJkIiwiZml4ZWRfYXdhcmQiLCJndWlsZF9hd2FyZCIsIl9maXhlZF9hd2FyZCIsImRlZXBDb3B5IiwicHVzaCIsImluZGV4IiwiX3giLCJfeSIsImJhY2twYWNrX2l0ZW0iLCJJdGVtc1Bvb2wiLCJnZXRJdGVtIiwiaW5pdENvbmZpZyIsIkJhY2tQYWNrSXRlbSIsIldpZHRoIiwiYmlkIiwiZmxvb3IiLCJkb3VibGVEZXNjIiwiQXJyYXkiLCJnZXRUeXBlIiwicGh5c2ljcyIsIm1hZ2ljIiwiY2xvc2VDYWxsQmFjayIsImRlbGV0ZU1lIiwibW9uc3Rlcl9saXN0IiwidW5iaW5kIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFJQSxRQUFRLEdBQUdDLE9BQU8sQ0FBQyxVQUFELENBQXRCOztBQUNBLElBQUlDLG1CQUFtQixHQUFHRCxPQUFPLENBQUMsc0JB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QUt6RSxJQUFMLENBQVUyRixjQUFWLENBQXlCLEtBQXpCO0FBQ0g7QUEvM0I4QixDQUFULENBQTFCO0FBbTRCQStNLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnhULG1CQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gQGF1dGhvcjogc2hpcmFob0BzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxyXG4vLyBAZGVzY3JpcHRpb246XHJcbi8vICAgICAg5YWs5LyaYm9zc+S4u+eql+S9k1xyXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG52YXIgUGF0aFRvb2wgPSByZXF1aXJlKFwicGF0aHRvb2xcIik7XHJcbnZhciBHdWlsZEJvc3NDb250cm9sbGVyID0gcmVxdWlyZShcImd1aWxkYm9zc19jb250cm9sbGVyXCIpO1xyXG52YXIgR3VpbGRFdmVudCA9IHJlcXVpcmUoXCJndWlsZF9ldmVudFwiKTtcclxudmFyIFBsYXllckhlYWQgPSByZXF1aXJlKFwicGxheWVyaGVhZFwiKTtcclxudmFyIEJhY2twYWNrQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYWNrcGFja19jb250cm9sbGVyXCIpO1xyXG52YXIgVGltZVRvb2wgPSByZXF1aXJlKFwidGltZXRvb2xcIik7XHJcbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XHJcbnZhciBHdWlsZGJvc3NFdmVudCA9IHJlcXVpcmUoXCJndWlsZGJvc3NfZXZlbnRcIik7XHJcbnZhciBHdWlsZEJvc3NDb25zdCA9IHJlcXVpcmUoXCJndWlsZGJvc3NfY29uc3RcIik7XHJcbnZhciBCYXNlUm9sZSA9IHJlcXVpcmUoXCJiYXNlcm9sZVwiKTtcclxudmFyIEhlcm9Db250cm9sbGVyID0gcmVxdWlyZShcImhlcm9fY29udHJvbGxlclwiKTtcclxudmFyIFBhcnRuZXJDb25zdCA9IHJlcXVpcmUoXCJwYXJ0bmVyX2NvbnN0XCIpO1xyXG52YXIgQWN0aXZpdHlDb250cm9sbGVyID0gcmVxdWlyZShcImFjdGl2aXR5X2NvbnRyb2xsZXJcIik7XHJcbnZhciBHdWlkZUV2ZW50ID0gcmVxdWlyZShcImd1aWRlX2V2ZW50XCIpO1xyXG5cclxudmFyIEd1aWxkQm9zc01haW5XaW5kb3cgPSBjYy5DbGFzcyh7XHJcbiAgICBleHRlbmRzOiBCYXNlVmlldyxcclxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwiZ3VpbGRib3NzXCIsIFwiZ3VpbGRib3NzX21haW5fd2luZG93XCIpO1xyXG4gICAgICAgIHRoaXMud2luX3R5cGUgPSBXaW5UeXBlLkJpZztcclxuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcuZGlhbG9ndWU7XHJcbiAgICAgICAgdGhpcy5jdHJsID0gR3VpbGRCb3NzQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgIHRoaXMubW9kZWwgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZG91YmxlUmV3YXJkTGlzdCA9IHt9XHJcbiAgICAgICAgdGhpcy5fY3VycmVudFBhc3NOdW0gPSB7fVxyXG4gICAgICAgIHRoaXMuX2RvdWJsZVBhc3NOdW0gPSB7fVxyXG4gICAgICAgIHRoaXMuaXRlbV9wb29sID0gW11cclxuICAgICAgICB0aGlzLml0ZW1fbGlzdCA9IFtdXHJcbiAgICAgICAgdGhpcy5pdGVtX2xpc3RfMSA9IHt9O1xyXG4gICAgICAgIHRoaXMuaXRlbV9saXN0XzIgPSB7fTtcclxuICAgICAgICB0aGlzLnJhbmtfbGlzdCA9IHt9XHJcbiAgICB9LFxyXG5cclxuXHJcbiAgICBvcGVuQ2FsbEJhY2s6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSB0aGlzLnNlZWtDaGlsZChcImJhY2tncm91bmRcIik7XHJcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLnNjYWxlID0gRklUX1NDQUxFO1xyXG4gICAgICAgIHZhciBtYWluX3BhbmVsID0gdGhpcy5zZWVrQ2hpbGQoXCJtYWluX3BhbmVsXCIpO1xyXG4gICAgICAgIHRoaXMuY2xvc2VfYnRuID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJjbG9zZV9idG5cIik7XHJcbiAgICAgICAgdGhpcy5leHBsYWluX2J0biA9IHRoaXMuc2Vla0NoaWxkKG1haW5fcGFuZWwsIFwiZXhwbGFpbl9idG5cIik7XHJcbiAgICAgICAgdGhpcy5hZGRfYnRuID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJhZGRfYnRuXCIpO1xyXG5cclxuICAgICAgICB0aGlzLnJhbmtfYnRuID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJyYW5rX2J0blwiKTtcclxuICAgICAgICB0aGlzLmNoYWxsZW5nZV9idG4gPSB0aGlzLnNlZWtDaGlsZChtYWluX3BhbmVsLCBcImNoYWxsZW5nZV9idG5cIik7XHJcbiAgICAgICAgdGhpcy5tb3B1cF9idG4gPSB0aGlzLnNlZWtDaGlsZChtYWluX3BhbmVsLCBcIm1vcHVwX2J0blwiLCBjYy5CdXR0b24pO1xyXG4gICAgICAgIHRoaXMuY2hhbGxlbmdlX2J0bl9sYWJlbCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuY2hhbGxlbmdlX2J0biwgXCJsYWJlbFwiLCBjYy5MYWJlbCk7XHJcbiAgICAgICAgdGhpcy5jaGFsbGVuZ2VfYnRuX2xvID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5jaGFsbGVuZ2VfYnRuLCBcImxhYmVsXCIsIGNjLkxhYmVsT3V0bGluZSk7XHJcbiAgICAgICAgdGhpcy5tb3B1cF9idG5fbGFiZWwgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1vcHVwX2J0bi5ub2RlLCBcImxhYmVsXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB0aGlzLm1vcHVwX2J0bl9sbyA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubW9wdXBfYnRuLm5vZGUsIFwibGFiZWxcIiwgY2MuTGFiZWxPdXRsaW5lKTtcclxuICAgICAgICB0aGlzLmNoYWxsZW5nZV9idG5fbGFiZWwuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLmjJHmiJhcIik7XHJcbiAgICAgICAgdGhpcy5tb3B1cF9idG5fbGFiZWwuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLmiavojaFcIik7XHJcblxyXG4gICAgICAgIC8v6ZuG57uTXHJcbiAgICAgICAgdGhpcy5tdXN0ZXJfYnRuID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJtdXN0ZXJfYnRuXCIpO1xyXG4gICAgICAgIHRoaXMubXVzdGVyX2J0bl90aXBzID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tdXN0ZXJfYnRuLCBcImxhYmVsXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB0aGlzLm11c3Rlcl9idG5fdGlwcy5zdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgICAgICB0aGlzLm11c3RlckltYWdlID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJtdXN0ZXJJbWFnZVwiKTtcclxuICAgICAgICAvLyB0aGlzLm11c3RlckltYWdlLnggPSB0aGlzLm11c3Rlcl9idG4ueCAtIDQzO1xyXG4gICAgICAgIHRoaXMubXVzdGVySW1hZ2UuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5tdXN0ZXJfYnRuX2xhYmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tdXN0ZXJJbWFnZSwgXCJsYWJlbFwiLCBjYy5MYWJlbCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RvdWJsZVJld2FyZCA9IHRoaXMuc2Vla0NoaWxkKG1haW5fcGFuZWwsIFwiZG91YmxlUmV3YXJkXCIpO1xyXG4gICAgICAgIHRoaXMuX2RvdWJsZVJld2FyZC5hY3RpdmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5yZXNldF90aW1lX3ZhbHVlID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJyZXNldF90aW1lX3ZhbHVlXCIsIGNjLlJpY2hUZXh0KTtcclxuICAgICAgICB0aGlzLmNoYWxsZW5nZV90aW1lc192YWx1ZSA9IHRoaXMuc2Vla0NoaWxkKG1haW5fcGFuZWwsIFwiY2hhbGxlbmdlX3RpbWVzX3ZhbHVlXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB0aGlzLmNoYXB0ZXJfbmFtZSA9IHRoaXMuc2Vla0NoaWxkKG1haW5fcGFuZWwsIFwiY2hhcHRlcl9uYW1lXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB0aGlzLmNoYXB0ZXJfYm9zc19jb250YWluZXIgPSB0aGlzLnNlZWtDaGlsZChtYWluX3BhbmVsLCBcImNoYXB0ZXJfYm9zc19jb250YWluZXJcIik7XHJcbiAgICAgICAgdmFyIFByZXZpZXcgPSByZXF1aXJlKFwiZ3VpbGRib3NzX3ByZXZpZXdfd2luZG93XCIpO1xyXG4gICAgICAgIHRoaXMuZ3VpbGRfYm9zc192aWV3ID0gbmV3IFByZXZpZXcoKTtcclxuICAgICAgICB0aGlzLmd1aWxkX2Jvc3Nfdmlldy5zZXRQYXJlbnQodGhpcy5jaGFwdGVyX2Jvc3NfY29udGFpbmVyKTtcclxuICAgICAgICB0aGlzLmd1aWxkX2Jvc3Nfdmlldy5zaG93KCk7XHJcblxyXG4gICAgICAgIHRoaXMuYnVmZl9jb250YWluZXIgPSB0aGlzLnNlZWtDaGlsZChtYWluX3BhbmVsLCBcImJ1ZmZfY29udGFpbmVyXCIpO1xyXG4gICAgICAgIHRoaXMuYnVmZl9uYW1lID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5idWZmX2NvbnRhaW5lciwgXCJidWZmX25hbWVcIiwgY2MuTGFiZWwpO1xyXG4gICAgICAgIHRoaXMuYnVmZl9uYW1lLnN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5idWZmX2ljb24gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmJ1ZmZfY29udGFpbmVyLCBcImJ1ZmZfaWNvblwiLCBjYy5TcHJpdGUpO1xyXG4gICAgICAgIHRoaXMuYnVmZl9hY2l0aXZlX2xhYmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5idWZmX2NvbnRhaW5lciwgXCJidWZmX2FjaXRpdmVfbGFiZWxcIiwgY2MuUmljaFRleHQpO1xyXG5cclxuICAgICAgICB0aGlzLnJlbWFpbl9idXlfbGIgPSB0aGlzLnNlZWtDaGlsZChtYWluX3BhbmVsLCBcInJlbWFpbl9idXlcIiwgY2MuTGFiZWwpO1xyXG5cclxuICAgICAgICB0aGlzLnJhbmtfY29udGFpbmVyID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJyYW5rX2NvbnRhaW5lclwiKTtcclxuICAgICAgICB0aGlzLnJhbmtfaW5mb19idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnJhbmtfY29udGFpbmVyLCBcInJhbmtfYnRuXCIpO1xyXG4gICAgICAgIHRoaXMucmFua19idG5fbGFiZWwgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnJhbmtfYnRuLCBcImxhYmVsXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB0aGlzLmJnID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJiZ1wiLCBjYy5TcHJpdGUpO1xyXG5cclxuICAgICAgICB2YXIgb2JqZWN0ID0ge307XHJcbiAgICAgICAgb2JqZWN0LmNvbnRhaW5lciA9IHRoaXMuc2Vla0NoaWxkKG1haW5fcGFuZWwsIFwibW9uc3Rlcl9jb250YWluZXJfMVwiKTtcclxuICAgICAgICBvYmplY3QubW9kZWwgPSB0aGlzLnNlZWtDaGlsZChvYmplY3QuY29udGFpbmVyLCBcIm1vbnN0ZXJfbW9kZWxcIik7XHJcbiAgICAgICAgb2JqZWN0LnBhc3NfaWNvbiA9IHRoaXMuc2Vla0NoaWxkKG9iamVjdC5jb250YWluZXIsIFwicGFzc19pY29uXCIpO1xyXG4gICAgICAgIG9iamVjdC5tb25zdGVyX25hbWUgPSB0aGlzLnNlZWtDaGlsZChvYmplY3QuY29udGFpbmVyLCBcIm1vbnN0ZXJfbmFtZVwiLCBjYy5MYWJlbCk7XHJcbiAgICAgICAgb2JqZWN0LnByb2dyZXNzX2NvbnRhaW5lciA9IHRoaXMuc2Vla0NoaWxkKG9iamVjdC5jb250YWluZXIsIFwicHJvZ3Jlc3NfY29udGFpbmVyXCIpO1xyXG4gICAgICAgIG9iamVjdC5wcm9ncmVzcyA9IHRoaXMuc2Vla0NoaWxkKG9iamVjdC5wcm9ncmVzc19jb250YWluZXIsIFwicHJvZ3Jlc3NcIiwgY2MuUHJvZ3Jlc3NCYXIpO1xyXG4gICAgICAgIG9iamVjdC5ocF92YWx1ZSA9IHRoaXMuc2Vla0NoaWxkKG9iamVjdC5wcm9ncmVzc19jb250YWluZXIsIFwiaHBfdmFsdWVcIiwgY2MuTGFiZWwpO1xyXG4gICAgICAgIG9iamVjdC5ib3NzX2ljb24gPSBuZXcgUGxheWVySGVhZCgpO1xyXG4gICAgICAgIHRoaXMuYm9zc19pY29uID0gb2JqZWN0LmJvc3NfaWNvbjtcclxuICAgICAgICBvYmplY3QuYm9zc19pY29uLnNob3coKVxyXG4gICAgICAgIG9iamVjdC5ib3NzX2ljb24uc2V0UG9zaXRpb24oLTEwNSwgMTMzKTtcclxuICAgICAgICBvYmplY3QuYm9zc19pY29uLnNldFNjYWxlKDAuNTUpO1xyXG4gICAgICAgIG9iamVjdC5ib3NzX2ljb24uc2V0UGFyZW50KG9iamVjdC5jb250YWluZXIpO1xyXG4gICAgICAgIHRoaXMubW9uc3Rlcl9jb250YWluZXIgPSBvYmplY3Q7XHJcblxyXG4gICAgICAgIHRoaXMubWFpbl9wYW5lbCA9IG1haW5fcGFuZWw7XHJcbiAgICB9LFxyXG5cclxuXHJcblxyXG4gICAgcmVnaXN0ZXJFdmVudDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMucm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XHJcbiAgICAgICAgaWYgKHRoaXMucm9sZV92byAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfYXNzZXRzX2V2ZW50ID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPSB0aGlzLnJvbGVfdm8uYmluZChFdmVudElkLlVQREFURV9ST0xFX0FUVFJJQlVURSwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09IFwicG9zaXRpb25cIikge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB0aGlzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm11c3Rlcl9idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfdm8ucG9zaXRpb24gPT0gMSB8fCB0aGlzLnJvbGVfdm8ucG9zaXRpb24gPT0gMikge1xyXG4gICAgICAgICAgICAgICAgdmFyIHN0ciA9IFV0aWxzLlRJMThOKFwi5Y+R5Ye66ZuG57uT5ZCO5bCG5Lya5o+Q6YaS5omA5pyJ5Lya5Y+L77yM5LiU5pyJMeWwj+aXtuWGheS4jeWPr+WGjeWPkeWHuumbhue7k++8iOWFqOS8mu+8ie+8jOaYr+WQpuehruWumuWPkeWHuumbhue7k++8n1wiKTtcclxuICAgICAgICAgICAgICAgIHZhciBmdW4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHJsLnNlbmQyMTMyMygpO1xyXG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICAgICB2YXIgQ29tbW9uQWxlcnQgPSByZXF1aXJlKFwiY29tbW9uYWxlcnRcIik7XHJcbiAgICAgICAgICAgICAgICBDb21tb25BbGVydC5zaG93KHN0ciwgVXRpbHMuVEkxOE4oXCLnoa7lrppcIiksIGZ1biwgVXRpbHMuVEkxOE4oXCLlj5bmtohcIiksIG51bGwsIDEsIG51bGwsIG51bGwsIDI0KVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuWPquacieS8mumVv+OAgeWJr+S8mumVv+WPr+WPkeWHuumbhue7k1wiKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIHRoaXMpXHJcblxyXG4gICAgICAgIHRoaXMuY2xvc2VfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmN0cmwub3Blbk1haW5XaW5kb3coZmFsc2UpO1xyXG4gICAgICAgIH0sIHRoaXMpXHJcblxyXG5cclxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEd1aWxkYm9zc0V2ZW50Lk11c3RlckNvb2xUaW1lLCBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yb2xlX3ZvLnBvc2l0aW9uID09IDEgfHwgdGhpcy5yb2xlX3ZvLnBvc2l0aW9uID09IDIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubXVzdGVyQ29vbENvdW50VGltZShkYXRhKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubXVzdGVyX2J0bl90aXBzLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi6ZuG57uT5Y+36KeSXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdGhpcylcclxuXHJcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChHdWlsZGJvc3NFdmVudC5Cb3NzQWN0aXZpdHlEb3VibGVUaW1lLCBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLmRvdWJsZVRpbWVBY3Rpb24oZGF0YSk7XHJcbiAgICAgICAgfSwgdGhpcylcclxuXHJcbiAgICAgICAgdGhpcy5idWZmX2NvbnRhaW5lci5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja0J1ZmYoKTtcclxuICAgICAgICB9LCB0aGlzKVxyXG5cclxuICAgICAgICB0aGlzLmJhY2tncm91bmQub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuTWFpbldpbmRvdyhmYWxzZSk7XHJcbiAgICAgICAgfSwgdGhpcylcclxuXHJcbiAgICAgICAgdGhpcy5leHBsYWluX2J0bi5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoMSk7XHJcbiAgICAgICAgICAgIHZhciBwb3MgPSBldmVudC50b3VjaC5nZXRMb2NhdGlvbigpO1xyXG4gICAgICAgICAgICByZXF1aXJlKFwidGlwc19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuc2hvd0NvbW1vblRpcHMoQ29uZmlnLmd1aWxkX2R1bl9kYXRhLmRhdGFfY29uc3QuZ2FtZV9ydWxlLmRlc2MsIHBvcyk7XHJcbiAgICAgICAgfSwgdGhpcylcclxuXHJcbiAgICAgICAgdGhpcy5hZGRfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmN0cmwucmVxdWVzdEJ1eUNoYWxsZW5nZVRpbWVzKDApO1xyXG4gICAgICAgIH0sIHRoaXMpXHJcblxyXG4gICAgICAgIHRoaXMucmFua19idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3RfaXRlbTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3VpbGRfYm9zc192aWV3KSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RfaXRlbSA9IHRoaXMuZ3VpbGRfYm9zc192aWV3LmdldEN1clNlbGVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RfaXRlbSAmJiBzZWxlY3RfaXRlbS5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwub3Blbkd1aWxkQm9zc1JhbmtXaW5kb3codHJ1ZSwgc2VsZWN0X2l0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCB0aGlzKVxyXG5cclxuICAgICAgICB0aGlzLnJhbmtfaW5mb19idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3VpbGRfYm9zc192aWV3KSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5ndWlsZF9ib3NzX3ZpZXcuZ2V0Q3VyU2VsZWN0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVxdWlyZShcInJhbmtfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5SYW5rVmlldyh0cnVlLCByZXF1aXJlKFwicmFua19jb25zdGFudFwiKS5SYW5rVHlwZS51bmlvbl9ib3NzLCBudWxsLCBkYXRhKTtcclxuICAgICAgICB9LCB0aGlzKVxyXG5cclxuICAgICAgICB0aGlzLmNoYWxsZW5nZV9idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cl9zZWxlY3RlZF9vYmplY3QgJiYgdGhpcy5jdXJfc2VsZWN0ZWRfb2JqZWN0LmNvbmZpZyAmJiB0aGlzLmJhc2VfaW5mbykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYmFzZV9pbmZvLmNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkub3BlbkZvcm1Hb0ZpZ2h0UGFuZWwodHJ1ZSwgUGFydG5lckNvbnN0LkZ1bl9Gb3JtLkd1aWxkRHVuX0FELCB7IGJvc3NfaWQ6IHRoaXMuY3VyX3NlbGVjdGVkX29iamVjdC5jb25maWcuYm9zc19pZCB9KVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwucmVxdWVzdEJ1eUNoYWxsZW5nZVRpbWVzKDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpZGVFdmVudC5UYXNrTmV4dFN0ZXAsXCJjaGFsbGVuZ2VfYnRuXCIpXHJcbiAgICAgICAgfSwgdGhpcylcclxuXHJcbiAgICAgICAgdGhpcy5tb3B1cF9idG4ubm9kZS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3NlbGVjdGVkX29iamVjdCAmJiB0aGlzLmN1cl9zZWxlY3RlZF9vYmplY3QuY29uZmlnICYmIHRoaXMuYmFzZV9pbmZvKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RNb3B1cE1vbnN0ZXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIHRoaXMpXHJcblxyXG4gICAgICAgIC8v5pu05paw6Z2i5p2/5Z+656GA5L+h5oGvXHJcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChHdWlsZGJvc3NFdmVudC5VcGRhdGVHdWlsZER1bkJhc2VJbmZvLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmd1aWxkX2Jvc3Nfdmlldykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ndWlsZF9ib3NzX3ZpZXcudXBkYXRlU2Nyb2xsVmlld0xpc3QoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUR1bkJhc2VJbmZvKCk7XHJcbiAgICAgICAgfSwgdGhpcylcclxuXHJcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChHdWlsZGJvc3NFdmVudC5VcGRhdGVDaGFuZ2VTdGF0dXMsIGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2hhbmdlU3RhdHVzKGRhdGEpO1xyXG4gICAgICAgIH0sIHRoaXMpXHJcblxyXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoR3VpbGRib3NzRXZlbnQuVXBkYXRlR3VpbGREdW5SYW5rLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciByYW5rX2xpc3QgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKS5nZXRSYWtuUm9sZVRvcFRocmVlTGlzdCgpO1xyXG4gICAgICAgICAgICBpZiAocmFua19saXN0ICYmIFV0aWxzLm5leHQocmFua19saXN0IHx8IHt9KSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHJhbmtfbGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2ID0gcmFua19saXN0W2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yYW5rX2xpc3RbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNyZWF0ZVNpbmdsZVJhbmtJdGVtKGksIHYpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmtfbGlzdFtpXSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5yYW5rX2xpc3RbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5sYWJlbC5zdHJpbmcgPSB2Lm5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LmFsbF9kcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udmFsdWUuc3RyaW5nID0gXCJbXCIgKyBVdGlscy5nZXRNb25leVN0cmluZyh2LmFsbF9kcHMsIGZhbHNlKSArIFV0aWxzLlRJMThOKFwi5Lyk5a6zXCIpICsgXCJdXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnZhbHVlLnN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCB0aGlzKVxyXG5cclxuICAgICAgICAvL+abtOaWsOW9k+WJjeWJqeS9meaMkeaImOasoeaVsFxyXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoR3VpbGRib3NzRXZlbnQuVXBkYXRlR3VpbGRCb3NzQ2hhbGxlbmdlVGltZXMsIGZ1bmN0aW9uIChidXlfdHlwZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5iYXNlX2luZm8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFsbGVuZ2VfdGltZXNfdmFsdWUuc3RyaW5nID0gdGhpcy5iYXNlX2luZm8uY291bnQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbWFpbkJ1eUNvdW50KHRoaXMuYmFzZV9pbmZvLmJ1eV9jb3VudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYmFzZV9pbmZvID0gdGhpcy5tb2RlbC5nZXRCYXNlSW5mbygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGJhc2VfaW5mbyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1haW5CdXlDb3VudChiYXNlX2luZm8uYnV5X2NvdW50KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYWxsZW5nZV90aW1lc192YWx1ZS5zdHJpbmcgPSBiYXNlX2luZm8uY291bnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy/mjJHmiJjotK3kubDnmoTml7blgJnoh6rliqjmiZPlvIDmjJHmiJjnlYzpnaJcclxuICAgICAgICAgICAgaWYgKGJ1eV90eXBlID09IDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXV0b09wZW5DaGFsbGVuZ2VXaW5kb3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIHRoaXMpO1xyXG5cclxuXHJcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChHdWlsZEV2ZW50LlVwZGF0ZUd1aWxkUmVkU3RhdHVzLCBmdW5jdGlvbiAodHlwZSwgc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU29tZVJlZFN0YXR1cyh0eXBlLCBzdGF0dXMpO1xyXG4gICAgICAgIH0sIHRoaXMpXHJcbiAgICB9LFxyXG5cclxuICAgIGNoZWNrQnVmZjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmJhc2VfaW5mbykge1xyXG4gICAgICAgICAgICB2YXIgaXRlbSA9IGdkYXRhKFwiZ3VpbGRfZHVuX2RhdGFcIiwgXCJkYXRhX2NvbnN0XCIsIFwiYnVmZl9pdGVtXCIpLnZhbDtcclxuICAgICAgICAgICAgdmFyIG51bSA9IEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0QmFja1BhY2tJdGVtTnVtQnlCaWQoaXRlbSk7XHJcbiAgICAgICAgICAgIHZhciBjb3N0ID0gZ2RhdGEoXCJndWlsZF9kdW5fZGF0YVwiLCBcImRhdGFfY29uc3RcIiwgXCJidWZmX2Nvc3RcIikudmFsO1xyXG4gICAgICAgICAgICB2YXIgaXRlbV9pY29uID0gVXRpbHMuZ2V0SXRlbUNvbmZpZyhpdGVtKS5pY29uO1xyXG4gICAgICAgICAgICB2YXIgaW5kZXhfbGV2ID0gTWF0aC5taW4odGhpcy5iYXNlX2luZm8uYnVmZl9sZXYgKyAxLCBDb25maWcuZ3VpbGRfZHVuX2RhdGEuZGF0YV9idWZmX2RhdGFfbGVuZ3RoKTtcclxuICAgICAgICAgICAgdmFyIGRlc2MgPSBnZGF0YShcImd1aWxkX2R1bl9kYXRhXCIsIFwiZGF0YV9idWZmX2RhdGFcIiwgW2luZGV4X2xldl0pLmRlc2M7XHJcbiAgICAgICAgICAgIHZhciBzdHIgPSBcIlwiO1xyXG4gICAgICAgICAgICB2YXIgc3RyXyA9IFwiXCI7XHJcbiAgICAgICAgICAgIHZhciBzdHJfZW5kID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwiPGNvbG9yPSM3NjQ1MTk+KOa/gOa0u+WQjuaViOaenOS4ujwvYz48Y29sb3I9IzI4OWIxNCA+PHNpemU9IDI0PiVzPC8+PC9jPjxjb2xvcj0jNzY0NTE5Pik8L2M+XCIpLCBkZXNjKTtcclxuICAgICAgICAgICAgdmFyIHJlcyA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChudW0gPiAwKSB7IC8v5aaC5p6c5a2Y5Zyo6YGT5YW3XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5iYXNlX2luZm8uYnVmZl9sZXYgPT0gMCkgeyAvL+ihqOekuuayoWJ1ZmZcclxuICAgICAgICAgICAgICAgICAgICBzdHIgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLmmK/lkKbmtojogJc8aW1nIHNyYz0nJXMnIHZpc2libGU9dHJ1ZSBzY2FsZT0wLjUgLz48Y29sb3I9IzI4OWIxNCA+PHNpemU9IDI0PiVzPC8+PC9jPjxjb2xvcj0jNzY0NTE5Pijmi6XmnIk6PC9jPjxjb2xvcj0jMjg5YjE0PjxzaXplPTI0PiVzPC8+PC9jPjxjb2xvcj0jNzY0NTE5Pinmv4DmtLvlhajlhazkvJrkvKTlrrPmj5DljYdCdWZmXFxuPC9jPlwiKSwgaXRlbV9pY29uLCAxLCBudW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0cl8gPSBzdHIgKyBzdHJfZW5kO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IFBhdGhUb29sLmdldEl0ZW1SZXMoaXRlbV9pY29uKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHIgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLmmK/lkKbmtojogJc8aW1nIHNyYz0nJXMnIHZpc2libGU9dHJ1ZSBzY2FsZT0wLjUgLz48Y29sb3I9IzI4OWIxNCA+PHNpemU9IDI0PiVzPC8+PC9jPjxjb2xvcj0jNzY0NTE5Pijmi6XmnIk6PC9jPjxjb2xvcj0jMjg5YjE0PjxzaXplPTI0PiVzPC8+PC9jPjxjb2xvcj0jNzY0NTE5Pinmv4DmtLvlhajlhazkvJrkvKTlrrPmj5DljYdCdWZmXFxuPC9jPlwiKSwgaXRlbV9pY29uLCAxLCBudW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0cl8gPSBzdHIgKyBzdHJfZW5kO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IFBhdGhUb29sLmdldEl0ZW1SZXMoaXRlbV9pY29uKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYmFzZV9pbmZvLmJ1ZmZfbGV2ID09IDApIHsgLy/ooajnpLrmsqFidWZmXHJcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi5piv5ZCm5raI6ICXPGltZyBzcmM9JyVzJyB2aXNpYmxlPXRydWUgc2NhbGU9MC41IC8+PGNvbG9yPSMyODliMTQgPjxzaXplPSAyND4lczwvPjwvYz48Y29sb3I9Izc2NDUxOT7mv4DmtLvlhajlhazkvJrkvKTlrrPmj5DljYdCdWZmXFxuPC9jPlwiKSwgQ29uZmlnLml0ZW1fZGF0YS5kYXRhX2Fzc2V0c19sYWJlbDJpZC5nb2xkLCBjb3N0KTtcclxuICAgICAgICAgICAgICAgICAgICBzdHJfID0gc3RyICsgc3RyX2VuZDtcclxuICAgICAgICAgICAgICAgICAgICByZXMgPSBQYXRoVG9vbC5nZXRJdGVtUmVzKENvbmZpZy5pdGVtX2RhdGEuZGF0YV9hc3NldHNfbGFiZWwyaWQuZ29sZClcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi5piv5ZCm5raI6ICXPGltZyBzcmM9JyVzJyB2aXNpYmxlPXRydWUgc2NhbGU9MC41IC8+PGNvbG9yPSMyODliMTQgPjxzaXplPSAyND4lczwvPjwvYz48Y29sb3I9Izc2NDUxOT7mv4DmtLvlhajlhazkvJrkvKTlrrPmj5DljYdCdWZmXFxuPC9jPlwiKSwgQ29uZmlnLml0ZW1fZGF0YS5kYXRhX2Fzc2V0c19sYWJlbDJpZC5nb2xkLCBjb3N0KTtcclxuICAgICAgICAgICAgICAgICAgICBzdHJfID0gc3RyICsgc3RyX2VuZDtcclxuICAgICAgICAgICAgICAgICAgICByZXMgPSBQYXRoVG9vbC5nZXRJdGVtUmVzKENvbmZpZy5pdGVtX2RhdGEuZGF0YV9hc3NldHNfbGFiZWwyaWQuZ29sZClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgZnVuID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLnNlbmQyMTMwNSgpO1xyXG4gICAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICAgICAgdmFyIENvbW1vbkFsZXJ0ID0gbmV3IHJlcXVpcmUoXCJjb21tb25hbGVydFwiKTtcclxuICAgICAgICAgICAgQ29tbW9uQWxlcnQuc2hvdyhzdHJfLCBVdGlscy5USTE4Tign56Gu6K6kJyksIGZ1biwgVXRpbHMuVEkxOE4oJ+WPlua2iCcpLCBudWxsLCAyLCBudWxsLCB7IHJlc0FycjogW3Jlc10gfSlcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIHVwZGF0ZU11c3RlckNvb2xUaW1lVGlja2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5yZW1haW5UaW1lID0gdGhpcy5yZW1haW5UaW1lIC0gMTtcclxuICAgICAgICBpZiAodGhpcy5yZW1haW5UaW1lIDw9IDApIHtcclxuICAgICAgICAgICAgdGhpcy5tdXN0ZXJJbWFnZS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5tdXN0ZXJfYnRuX3RpcHMuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5tdXN0ZXJfYnRuX2xhYmVsLm5vZGUuc3RvcEFsbEFjdGlvbnMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tdXN0ZXJfYnRuX2xhYmVsLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIiVzXFxu5ZCO5Y+v6ZuG57uTXCIpLCBUaW1lVG9vbC5nZXRUaW1lRm9ybWF0KHRoaXMucmVtYWluVGltZSkpO1xyXG4gICAgfSxcclxuXHJcbiAgICBtdXN0ZXJDb29sQ291bnRUaW1lOiBmdW5jdGlvbiAobGVzc190aW1lKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm11c3Rlcl9idG5fbGFiZWwpIHJldHVyblxyXG4gICAgICAgIHRoaXMucmVtYWluVGltZSA9IGxlc3NfdGltZTtcclxuICAgICAgICB0aGlzLm11c3Rlcl9idG5fbGFiZWwubm9kZS5zdG9wQWxsQWN0aW9ucygpO1xyXG4gICAgICAgIGlmICh0aGlzLnJlbWFpblRpbWUgPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMubXVzdGVySW1hZ2UuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICB0aGlzLm11c3Rlcl9idG5fbGFiZWwubm9kZS5ydW5BY3Rpb24oY2MucmVwZWF0Rm9yZXZlcihjYy5zZXF1ZW5jZShjYy5kZWxheVRpbWUoMSksIGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYucmVtYWluVGltZSA9IHNlbGYucmVtYWluVGltZSAtIDE7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5yZW1haW5UaW1lIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLm11c3RlckltYWdlLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYubXVzdGVyX2J0bl90aXBzLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5tdXN0ZXJfYnRuX2xhYmVsLm5vZGUuc3RvcEFsbEFjdGlvbnMoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5tdXN0ZXJJbWFnZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYubXVzdGVyX2J0bl90aXBzLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYubXVzdGVyX2J0bl9sYWJlbC5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCIlc1xcbuWQjuWPr+mbhue7k1wiKSwgVGltZVRvb2wuZ2V0VGltZUZvcm1hdChzZWxmLnJlbWFpblRpbWUpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpKSlcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVNdXN0ZXJDb29sVGltZVRpY2tldCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubXVzdGVySW1hZ2UuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMubXVzdGVyX2J0bl9sYWJlbC5ub2RlLnN0b3BBbGxBY3Rpb25zKCk7XHJcbiAgICAgICAgICAgIHRoaXMubXVzdGVyX2J0bl90aXBzLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi6ZuG57uT5Y+36KeSXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy/liIfmjaJCb3Nz55qE5pe25YCZXHJcbiAgICB1cGRhdGVDaGFuZ2VTdGF0dXM6IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm5cclxuICAgICAgICB2YXIgZmlkID0gMDtcclxuICAgICAgICB2YXIgYmFzZV9pbmZvID0gdGhpcy5tb2RlbC5nZXRCYXNlSW5mbygpO1xyXG4gICAgICAgIHZhciBvYmplY3QgPSB0aGlzLm1vbnN0ZXJfY29udGFpbmVyO1xyXG4gICAgICAgIHZhciBocF9pbmZvID0gbnVsbDtcclxuICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT0gMCkge1xyXG4gICAgICAgICAgICBmaWQgPSBiYXNlX2luZm8uZmlkO1xyXG4gICAgICAgICAgICBpZiAoYmFzZV9pbmZvICE9IG51bGwgJiYgYmFzZV9pbmZvLmluZm8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy/lgqjlrZjlrrnlmajph4zpnaLnm7jlhbPnmoRib3Nz5qih5Z6LXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGJhc2VfaW5mby5pbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBiYXNlX2luZm8uaW5mb1tpXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYm9zc19jb25maWcgPSBnZGF0YShcImd1aWxkX2R1bl9kYXRhXCIsIFwiZGF0YV9ndWlsZGJvc3NfbGlzdFwiLCBbdi5ib3NzX2lkXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvc3NfY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmNvbmZpZyA9IGJvc3NfY29uZmlnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHBfaW5mbyA9IHY7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoYmFzZV9pbmZvLmNvbWJhdF9pbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBiYXNlX2luZm8uY29tYmF0X2luZm8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBiYXNlX2luZm8uY29tYmF0X2luZm9baV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgJiYgb2JqZWN0LmNvbmZpZyAmJiB2LmJvc3NfaWQgPT0gb2JqZWN0LmNvbmZpZy5ib3NzX2lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuZHBzID0gdi5kcHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5idWZmX2NvbnRhaW5lci5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZpZCA9IGRhdGEuY29uZmlnLmlkO1xyXG4gICAgICAgICAgICBvYmplY3QuY29uZmlnID0gZGF0YS5jb25maWc7XHJcbiAgICAgICAgICAgIGhwX2luZm8gPSB7IGJvc3NfaWQ6IGRhdGEuY29uZmlnLmJvc3NfaWQsIGhwOiAwIH07XHJcbiAgICAgICAgICAgIG9iamVjdC5kcHMgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLmJ1ZmZfY29udGFpbmVyLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmlkKSB7XHJcbiAgICAgICAgICAgIHZhciBjaGF0cHRlcl9jb25maWcgPSBnZGF0YShcImd1aWxkX2R1bl9kYXRhXCIsIFwiZGF0YV9jaGFwdGVyX3Jld2FyZFwiLCBbZmlkXSk7XHJcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBnZGF0YShcImd1aWxkX2R1bl9kYXRhXCIsIFwiZGF0YV9ndWlsZGJvc3NfbGlzdFwiLCBbY2hhdHB0ZXJfY29uZmlnLnNob3dfaWRdKTtcclxuICAgICAgICAgICAgaWYgKGNoYXRwdGVyX2NvbmZpZyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXB0ZXJfbmFtZS5zdHJpbmcgPSBjaGF0cHRlcl9jb25maWcuY2hhcHRlcl9uYW1lICsgXCIgXCIgKyBjaGF0cHRlcl9jb25maWcuY2hhcHRlcl9kZXNjO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQmcoY29uZmlnLmJnX3Jlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChocF9pbmZvKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTW9uc3RlckhQU3RhdHVzKG9iamVjdCwgaHBfaW5mbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvYmplY3QpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVNb25zdGVySW5mbyhvYmplY3QpOy8v5pu05paw5qih5Z6LXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRCdG5TdGF0dXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGNyZWF0ZVNpbmdsZVJhbmtJdGVtOiBmdW5jdGlvbiAoaSwgZGF0YSkge1xyXG4gICAgICAgIHZhciBjb250YWluZXIgPSB7fVxyXG4gICAgICAgIHZhciBub2RlID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5yYW5rX2NvbnRhaW5lciwgXCJyYW5rX1wiICsgKE51bWJlcihpKSArIDEpKTtcclxuICAgICAgICB2YXIgbGFiZWwgPSB0aGlzLnNlZWtDaGlsZChub2RlLCBcImxhYmVsXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnNlZWtDaGlsZChub2RlLCBcInZhbHVlXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB2YXIgc3AgPSB0aGlzLnNlZWtDaGlsZChub2RlLCBcInNwXCIpO1xyXG4gICAgICAgIGNvbnRhaW5lci5ub2RlID0gbm9kZTtcclxuICAgICAgICBjb250YWluZXIubGFiZWwgPSBsYWJlbDtcclxuICAgICAgICBjb250YWluZXIudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICBjb250YWluZXIuc3AgPSBzcDtcclxuICAgICAgICByZXR1cm4gY29udGFpbmVyXHJcbiAgICB9LFxyXG5cclxuICAgIHJlcXVlc3RNb3B1cE1vbnN0ZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy5iYXNlX2luZm8gPT0gbnVsbCkgcmV0dXJuXHJcbiAgICAgICAgdmFyIGJhc2VfaW5mbyA9IHRoaXMuYmFzZV9pbmZvO1xyXG4gICAgICAgIGlmIChiYXNlX2luZm8uY291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBtc2cgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLnoa7lrprmjInnhafkuIrmrKHmjJHmiJjnmoTkvKTlrrPph488Y29sb3I9IzI0OTAwMz4lczwvYz7miavojaHkuIDmrKHlkJfvvJ9cIiksIHRoaXMuY3VyX3NlbGVjdGVkX29iamVjdC5kcHMpO1xyXG4gICAgICAgICAgICB2YXIgQ29tbW9uQWxlcnQgPSByZXF1aXJlKFwiY29tbW9uYWxlcnRcIik7XHJcbiAgICAgICAgICAgIENvbW1vbkFsZXJ0LnNob3cobXNnLCBVdGlscy5USTE4TihcIuehruWumlwiKSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLnJlcXVlc3RNb3B1cE1vbnN0ZXIodGhpcy5jdXJfc2VsZWN0ZWRfb2JqZWN0LmNvbmZpZy5ib3NzX2lkKVxyXG4gICAgICAgICAgICB9LmJpbmQodGhpcyksIFV0aWxzLlRJMThOKFwi5Y+W5raIXCIpLCBudWxsLCAyKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBidXlfbmV4dF9udW0gPSBiYXNlX2luZm8uYnV5X2NvdW50ICsgMTtcclxuICAgICAgICAgICAgdmFyIGJ1eV9jb25maWcgPSBnZGF0YShcImd1aWxkX2R1bl9kYXRhXCIsIFwiZGF0YV9idXlfY291bnRcIiwgW2J1eV9uZXh0X251bV0pO1xyXG4gICAgICAgICAgICBpZiAoYnV5X2NvbmZpZyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5b2T5YmN5rKh5pyJ5omr6I2h5qyh5pWw77yM5LiU6LSt5Lmw5qyh5pWw5bey5Yiw6L6+5pys5pel5LiK6ZmQ77yBXCIpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciByb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcclxuICAgICAgICAgICAgICAgIGlmIChyb2xlX3ZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVfdm8udmlwX2xldiA8IGJ1eV9jb25maWcudmlwX2xldikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbXNnID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi5oyR5oiY5qyh5pWw5LiN6Laz77yM5o+Q5Y2H6IezPGNvbG9yPScjMjg5YjE0Jz52aXAlczwvYz7vvIzlj6/lop7liqA8Y29sb3I9JyMyODliMTQnPjE8L2M+54K55qyh5pWw6LSt5Lmw5LiK6ZmQ77yBXCIpLCBidXlfY29uZmlnLnZpcF9sZXYpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgQ29tbW9uQWxlcnQgPSByZXF1aXJlKFwiY29tbW9uYWxlcnRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkFsZXJ0LnNob3cobXNnLCBVdGlscy5USTE4TihcIuaIkeimgeaPkOWNh1wiKSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZShcInZpcF9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlblZpcE1haW5XaW5kb3codHJ1ZSwgVklQVEFCQ09OU1QuQ0hBUkdFKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksIFV0aWxzLlRJMThOKFwi5Y+W5raIXCIpLCBudWxsLCAyKVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb3N0ID0gYnV5X2NvbmZpZy5leHBlbmQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3N0ID09IG51bGwgfHwgY29zdC5sZW5ndGggPCAyKSByZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1fY29uZmlnID0gVXRpbHMuZ2V0SXRlbUNvbmZpZyhjb3N0WzBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1fY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbXNnID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi5oyR5oiY5qyh5pWw5LiN6Laz77yM5piv5ZCm6Iqx6LS5IDxpbWcgc3JjPSclcycgc2NhbGU9MC41IC8+ICVzIOi0reS5sDxjb2xvcj0jMjg5YjE0PjE8L2M+54K55oyR5oiY5qyh5pWw5bm25omr6I2h77yfXFxuKOaJq+iNoeagueaNruS4iuasoeeahOS8pOWus+mHjzxjb2xvcj0jMjQ5MDAzPiVzPC9jPui/m+ihjOe7k+eulylcIiksIGl0ZW1fY29uZmlnLmljb24sIGNvc3RbMV0sIHRoaXMuY3VyX3NlbGVjdGVkX29iamVjdC5kcHMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gUGF0aFRvb2wuZ2V0SXRlbVJlcyhpdGVtX2NvbmZpZy5pY29uKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIENvbW1vbkFsZXJ0ID0gcmVxdWlyZShcImNvbW1vbmFsZXJ0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uQWxlcnQuc2hvdyhtc2csIFV0aWxzLlRJMThOKFwi56Gu5a6aXCIpLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHJsLnJlcXVlc3RNb3B1cE1vbnN0ZXIodGhpcy5jdXJfc2VsZWN0ZWRfb2JqZWN0LmNvbmZpZy5ib3NzX2lkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgVXRpbHMuVEkxOE4oXCLlj5bmtohcIiksIG51bGwsIDIsIG51bGwsIHsgcmVzQXJyOiBbcmVzXSB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8v5Z+656GA5L+h5oGv77yM5pyN5Yqh56uv6KaB5rGC5rKh5qyh5omT5byA6Z2i5p2/55qE5pe25YCZ6YO96K+35rGC5LiA5LiLXHJcbiAgICAgICAgdGhpcy5jdHJsLnJlcXVlc3RHdWlsZER1bkJhc2VJbmZvKCk7XHJcbiAgICAgICAgQWN0aXZpdHlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0Rmlyc3RDb21lR3VpbGQoZmFsc2UpXHJcbiAgICAgICAgLy/orr7nva7liJ3lp4vnuqLngrlcclxuICAgICAgICB0aGlzLnVwZGF0ZVNvbWVSZWRTdGF0dXMoKTtcclxuICAgICAgICBpZiAoQWN0aXZpdHlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Qm9zc0FjdGl2aXR5RG91YmxlVGltZSgpID09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fZG91YmxlUmV3YXJkLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+iuvue9rmJ1ZmblgJLorqHml7ZcclxuICAgIHVwZGF0ZUJ1ZmZUaW1lOiBmdW5jdGlvbiAodGltZSkge1xyXG4gICAgICAgIGlmICh0aW1lICYmIHRpbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5idWZmX3NlY29uZCA9IHRpbWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1ZmZfc2Vjb25kIDw9IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJCdWZmVGltZVRpY2tldCgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYnVmZl90aW1lX3RpY2tldCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmX3RpbWVfdGlja2V0ID0gZ2NvcmUuVGltZXIuc2V0KChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQnVmZlRpbWVUaWNrZXQoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcyksIDEwMDAsIC0xKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgY2xlYXJCdWZmVGltZVRpY2tldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmJ1ZmZfdGltZV90aWNrZXQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy5idWZmX3RpbWVfdGlja2V0KTtcclxuICAgICAgICAgICAgdGhpcy5idWZmX3RpbWVfdGlja2V0ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIHVwZGF0ZUJ1ZmZUaW1lVGlja2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5idWZmX3NlY29uZCA9IHRoaXMuYnVmZl9zZWNvbmQgLSAxO1xyXG4gICAgICAgIGlmICh0aGlzLmJ1ZmZfc2Vjb25kIDw9IDApIHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhckJ1ZmZUaW1lVGlja2V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYnVmZl9hY2l0aXZlX2xhYmVsLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIjxjb2xvcj0jMzVmZjE0Piglc+WQjuWkseaViCk8L2M+XCIpLCBUaW1lVG9vbC5nZXRUaW1lRm9ybWF0KHRoaXMuYnVmZl9zZWNvbmQpKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy/mjJHmiJjotK3kubDmrKHmlbDnmoTml7blgJnoh6rliqjmiZPlvIDpnaLmnb9cclxuICAgIGF1dG9PcGVuQ2hhbGxlbmdlV2luZG93OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VyX3NlbGVjdGVkX29iamVjdCAmJiB0aGlzLmN1cl9zZWxlY3RlZF9vYmplY3QuY29uZmlnICYmIHRoaXMuYmFzZV9pbmZvKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJhc2VfaW5mby5jb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgIEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkub3BlbkZvcm1Hb0ZpZ2h0UGFuZWwodHJ1ZSwgUGFydG5lckNvbnN0LkZ1bl9Gb3JtLkd1aWxkRHVuX0FELCB7IGJvc3NfaWQ6IHRoaXMuY3VyX3NlbGVjdGVkX29iamVjdC5jb25maWcuYm9zc19pZCB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+WNj+iurui/lOWbnueUqOS6juabtOaWsOWfuuehgOS/oeaBr1xyXG4gICAgdXBkYXRlRHVuQmFzZUluZm86IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmJhc2VfaW5mbyA9IHRoaXMubW9kZWwuZ2V0QmFzZUluZm8oKTtcclxuICAgICAgICB2YXIgYmFzZV9pbmZvID0gdGhpcy5iYXNlX2luZm87XHJcbiAgICAgICAgaWYgKGJhc2VfaW5mbyAhPSBudWxsICYmIGJhc2VfaW5mby5pbmZvICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1haW5CdXlDb3VudChiYXNlX2luZm8uYnV5X2NvdW50KTtcclxuICAgICAgICAgICAgLy/lgqjlrZjlrrnlmajph4zpnaLnm7jlhbPnmoRib3Nz5qih5Z6LXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gYmFzZV9pbmZvLmluZm8pIHtcclxuICAgICAgICAgICAgICAgIHZhciB2ID0gYmFzZV9pbmZvLmluZm9baV07XHJcbiAgICAgICAgICAgICAgICB2YXIgYm9zc19jb25maWcgPSBnZGF0YShcImd1aWxkX2R1bl9kYXRhXCIsIFwiZGF0YV9ndWlsZGJvc3NfbGlzdFwiLCBbdi5ib3NzX2lkXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYm9zc19jb25maWcpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5tb25zdGVyX2NvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmNvbmZpZyA9IGJvc3NfY29uZmlnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL+abtOaWsOihgOmHj1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU1vbnN0ZXJIUFN0YXR1cyhvYmplY3QsIHYpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL+WtmOWCqGRwc1xyXG4gICAgICAgICAgICBpZiAoYmFzZV9pbmZvLmNvbWJhdF9pbmZvKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuYmFzZV9pbmZvLmNvbWJhdF9pbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmJhc2VfaW5mby5jb21iYXRfaW5mb1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tb25zdGVyX2NvbnRhaW5lciAmJiB0aGlzLm1vbnN0ZXJfY29udGFpbmVyLmNvbmZpZyAmJiB2LmJvc3NfaWQgPT0gdGhpcy5tb25zdGVyX2NvbnRhaW5lci5jb25maWcuYm9zc19pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnN0ZXJfY29udGFpbmVyLmRwcyA9IHYuZHBzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy/orr7nva7ln7rnoYDkv6Hmga/mmL7npLpcclxuICAgICAgICAgICAgdGhpcy5jaGFsbGVuZ2VfdGltZXNfdmFsdWUuc3RyaW5nID0gYmFzZV9pbmZvLmNvdW50O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJfZmlkICE9IGJhc2VfaW5mby5maWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VyX2ZpZCA9IGJhc2VfaW5mby5maWQ7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2hhdHB0ZXJfY29uZmlnID0gZ2RhdGEoXCJndWlsZF9kdW5fZGF0YVwiLCBcImRhdGFfY2hhcHRlcl9yZXdhcmRcIiwgW2Jhc2VfaW5mby5maWRdKTtcclxuICAgICAgICAgICAgICAgIGlmIChjaGF0cHRlcl9jb25maWcgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vbnN0ZXJfY29udGFpbmVyICYmIHRoaXMubW9uc3Rlcl9jb250YWluZXIuYm9zc19pY29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSBnZGF0YShcImd1aWxkX2R1bl9kYXRhXCIsIFwiZGF0YV9ndWlsZGJvc3NfbGlzdFwiLCBbY2hhdHB0ZXJfY29uZmlnLnNob3dfaWRdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb25zdGVyX2NvbnRhaW5lci5ib3NzX2ljb24uc2V0SGVhZFJlcyhjb25maWcuaGVhZF9pY29uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQmcoY29uZmlnLmJnX3Jlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFwdGVyX25hbWUuc3RyaW5nID0gY2hhdHB0ZXJfY29uZmlnLmNoYXB0ZXJfbmFtZSArIFwiIFwiICsgY2hhdHB0ZXJfY29uZmlnLmNoYXB0ZXJfZGVzYztcclxuICAgICAgICAgICAgICAgICAgICAvL+i/memHjOiuvue9ruaMkeaImOWlluWKseWQp1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsbFJld2FyZHNJdGVtcyhjaGF0cHRlcl9jb25maWcuZHBzX2F3cmFyZCwgY2hhdHB0ZXJfY29uZmlnLmF3YXJkLCBjaGF0cHRlcl9jb25maWcuZ3VpbGRfZXhwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy/lu7bov5/liJvlu7rmqKHlnotcclxuICAgICAgICAgICAgZ2NvcmUuVGltZXIuc2V0KChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU1vbnN0ZXJJbmZvKHRoaXMubW9uc3Rlcl9jb250YWluZXIpO1xyXG4gICAgICAgICAgICB9KS5iaW5kKHRoaXMpLCA4IC8gNjAsIDEpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjZXRNb25zdGVyQ29udGFpbmVyKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYmFzZV9pbmZvICE9IG51bGwgJiYgYmFzZV9pbmZvLmJ1ZmZfZW5kX3RpbWUgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGJ1ZmZfY29uZmlnID0gZ2RhdGEoXCJndWlsZF9kdW5fZGF0YVwiLCBcImRhdGFfYnVmZl9kYXRhXCIsIFtiYXNlX2luZm8uYnVmZl9sZXZdKTtcclxuICAgICAgICAgICAgICAgIGlmIChidWZmX2NvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZl9uYW1lLnN0cmluZyA9IGJ1ZmZfY29uZmlnLmRlc2M7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5idWZmX2FjaXRpdmVfbGFiZWwubm9kZS54ID0gdGhpcy5idWZmX25hbWUubm9kZS53aWR0aCArIHRoaXMuYnVmZl9uYW1lLm5vZGUueCArIDEwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5idWZmX2ljb24uc2V0U3RhdGUoY2MuU3ByaXRlLlN0YXRlLk5PUk1BTCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfbmFtZS5ub2RlLmNvbG9yID0gbmV3IGNjLkNvbG9yKDEzNywgMjM3LCAyNTUsIDI1NSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJ1ZmZUaW1lKGJhc2VfaW5mby5idWZmX2VuZF90aW1lKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnVmZl9jb250YWluZXIuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnVmZl9pY29uLnNldFN0YXRlKGNjLlNwcml0ZS5TdGF0ZS5HUkFZKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5idWZmX25hbWUubm9kZS5jb2xvciA9IG5ldyBjYy5Db2xvcihjYy5Db2xvci5XSElURSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfbmFtZS5zdHJpbmcgPSBnZGF0YShcImd1aWxkX2R1bl9kYXRhXCIsIFwiZGF0YV9jb25zdFwiLCBbXCJkZXNfbm9idWZmXCJdKS5kZXNjO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5idWZmX2FjaXRpdmVfbGFiZWwubm9kZS54ID0gdGhpcy5idWZmX25hbWUubm9kZS53aWR0aCArIHRoaXMuYnVmZl9uYW1lLm5vZGUueCArIDEwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5idWZmX2FjaXRpdmVfbGFiZWwuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCI8Y29sb3I9I2ZmNTg1OD4o5pyq5r+A5rS7KTwvYz5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8v5Ymp5L2Z6LSt5Lmw5qyh5pWwXHJcbiAgICByZW1haW5CdXlDb3VudDogZnVuY3Rpb24gKGNvdW50KSB7XHJcbiAgICAgICAgY291bnQgPSBjb3VudCB8fCAwO1xyXG4gICAgICAgIHZhciBudW0gPSAwO1xyXG4gICAgICAgIHZhciBsZW5ndGggPSBDb25maWcuZ3VpbGRfZHVuX2RhdGEuZGF0YV9idXlfY291bnRfbGVuZ3RoO1xyXG4gICAgICAgIHZhciBidXlfY29uZmlnID0gQ29uZmlnLmd1aWxkX2R1bl9kYXRhLmRhdGFfYnV5X2NvdW50W2xlbmd0aF07XHJcbiAgICAgICAgaWYgKGJ1eV9jb25maWcpIHtcclxuICAgICAgICAgICAgbnVtID0gYnV5X2NvbmZpZy5jb3VudCAtIGNvdW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlbWFpbl9idXlfbGIuc3RyaW5nID0gbnVtO1xyXG4gICAgfSxcclxuXHJcbiAgICB1cGRhdGVCZzogZnVuY3Rpb24gKGltYWdlKSB7XHJcbiAgICAgICAgdmFyIHJlc19pZCA9IFBhdGhUb29sLmdldEJpZ0JnKGltYWdlLCBudWxsLCBcImd1aWxkYm9zc1wiKTtcclxuICAgICAgICBpZiAodGhpcy5yZXNfaWQgIT0gcmVzX2lkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzX2lkID0gcmVzX2lkO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRSZXModGhpcy5yZXNfaWQsIGZ1bmN0aW9uIChzZl9vYmopIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmcuc3ByaXRlRnJhbWUgPSBzZl9vYmo7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8v5Yib5bu65qih5Z6LLOagueaNrmNvbmZpZ1xyXG4gICAgdXBkYXRlTW9uc3RlckluZm86IGZ1bmN0aW9uIChvYmplY3QpIHtcclxuICAgICAgICBpZiAob2JqZWN0ID09IG51bGwgfHwgb2JqZWN0LmNvbmZpZyA9PSBudWxsKSByZXR1cm5cclxuICAgICAgICB2YXIgY29uZmlnID0gb2JqZWN0LmNvbmZpZztcclxuICAgICAgICAvL+aAqueJqeaooeWei+aWuemdou+8jOWPquaciWlk5LiN5ZCM5omN5YGa5aSE55CGXHJcbiAgICAgICAgaWYgKG9iamVjdC5ib3NzX2lkICE9IGNvbmZpZy5ib3NzX2lkKSB7XHJcbiAgICAgICAgICAgIG9iamVjdC5ib3NzX2lkID0gY29uZmlnLmJvc3NfaWQ7XHJcbiAgICAgICAgICAgIG9iamVjdC5tb25zdGVyX25hbWUuc3RyaW5nID0gY29uZmlnLml0ZW1fbmFtZTtcclxuICAgICAgICAgICAgLy/muIXpmaTmjonkuYvliY3nmoTmqKHlnotcclxuICAgICAgICAgICAgaWYgKG9iamVjdC5zcGluZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gb2JqZWN0LnNwaW5lLmRlbGV0ZU1lKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBvYmplY3Quc3BpbmUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgb2JqZWN0LnNwaW5lLnNldERhdGEoQmFzZVJvbGUudHlwZS51bml0LCBjb25maWcuY29tYmF0X2lkLCBQbGF5ZXJBY3Rpb24uc2hvdywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvYmplY3Quc3BpbmUgPSBuZXcgQmFzZVJvbGUoKTtcclxuICAgICAgICAgICAgICAgIG9iamVjdC5zcGluZS5zZXRQYXJlbnQob2JqZWN0Lm1vZGVsKTtcclxuICAgICAgICAgICAgICAgIG9iamVjdC5zcGluZS5zZXREYXRhKEJhc2VSb2xlLnR5cGUudW5pdCwgY29uZmlnLmNvbWJhdF9pZCwgUGxheWVyQWN0aW9uLnNob3csIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+mAieS4reaMh+WumueahOaAqueJqeiKgueCuVxyXG4gICAgc2VsZWNldE1vbnN0ZXJDb250YWluZXI6IGZ1bmN0aW9uICh0eXBlKSB7XHJcbiAgICAgICAgdGhpcy5jdXJfc2VsZWN0ZWRfb2JqZWN0ID0gdGhpcy5tb25zdGVyX2NvbnRhaW5lcjtcclxuICAgICAgICAvLyB2YXIgcHJvdG9jYWwgPSB7XHJcbiAgICAgICAgLy8gICAgIGJvc3NfaWQ6IHRoaXMuY3VyX3NlbGVjdGVkX29iamVjdC5jb25maWcuYm9zc19pZCxcclxuICAgICAgICAvLyAgICAgc3RhcnRfbnVtOiAxLFxyXG4gICAgICAgIC8vICAgICBlbmRfbnVtOiAzXHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIHRoaXMuY3RybC5yZXF1ZXN0R3VpbGREdW5SYW5rKEd1aWxkQm9zc0NvbnN0LnJhbmsucm9sZSwgcHJvdG9jYWwpXHJcbiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZEJ0blN0YXR1cygpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvL+abtOaWsOmAieS4reWvueixoeeahOaMiemSrueKtuaAgVxyXG4gICAgdXBkYXRlU2VsZWN0ZWRCdG5TdGF0dXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy5jdXJfc2VsZWN0ZWRfb2JqZWN0ID09IG51bGwpIHJldHVyblxyXG4gICAgICAgIGlmICh0aGlzLmN1cl9zZWxlY3RlZF9vYmplY3QuaHAgPT0gbnVsbCB8fCB0aGlzLmN1cl9zZWxlY3RlZF9vYmplY3QuZHBzID09IG51bGwpIHJldHVyblxyXG4gICAgICAgIGlmICh0aGlzLmN1cl9zZWxlY3RlZF9vYmplY3QuaHAgPT0gMCkgeyAvL+W3sue7j+iiq+WHu+adgOS6hlxyXG4gICAgICAgICAgICBVdGlscy5zZXRHcmV5QnV0dG9uKHRoaXMuY2hhbGxlbmdlX2J0biwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIFV0aWxzLnNldEdyZXlCdXR0b24odGhpcy5tb3B1cF9idG4sIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLmNoYWxsZW5nZV9idG5fbG8uZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLm1vcHVwX2J0bl9sby5lbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3NlbGVjdGVkX29iamVjdC5kcHMgPT0gMCkgeyAgICAvL+ayoeacieaMkeaImOi/h++8jOS4jeWPr+S7peaJq+iNoVxyXG4gICAgICAgICAgICAgICAgVXRpbHMuc2V0R3JleUJ1dHRvbih0aGlzLm1vcHVwX2J0biwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBVdGlscy5zZXRHcmV5QnV0dG9uKHRoaXMuY2hhbGxlbmdlX2J0biwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFsbGVuZ2VfYnRuX2xvLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb3B1cF9idG5fbG8uZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgVXRpbHMuc2V0R3JleUJ1dHRvbih0aGlzLmNoYWxsZW5nZV9idG4sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIFV0aWxzLnNldEdyZXlCdXR0b24odGhpcy5tb3B1cF9idG4sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbGxlbmdlX2J0bl9sby5lbmFibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9wdXBfYnRuX2xvLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+abtOaWsOihgOadoVxyXG4gICAgdXBkYXRlTW9uc3RlckhQU3RhdHVzOiBmdW5jdGlvbiAob2JqZWN0LCBpbmZvKSB7XHJcbiAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsIHx8IGluZm8gPT0gbnVsbCB8fCBvYmplY3QuY29uZmlnID09IG51bGwpIHJldHVyblxyXG4gICAgICAgIGlmIChpbmZvLmhwIDw9IDApIHtcclxuICAgICAgICAgICAgdGhpcy5kb3VibGVUaW1lQWN0aW9uKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoQWN0aXZpdHlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Qm9zc0FjdGl2aXR5RG91YmxlVGltZSgpID09IHRydWUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRvdWJsZVRpbWVBY3Rpb24odHJ1ZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgLy/orr7nva7ooYDph49cclxuICAgICAgICB2YXIgY29uZmlnID0gb2JqZWN0LmNvbmZpZztcclxuICAgICAgICB2YXIgcGVyY2VudCA9IE1hdGguY2VpbCgxMDAgKiBpbmZvLmhwIC8gY29uZmlnLmhwKTtcclxuICAgICAgICBvYmplY3QuaHBfdmFsdWUuc3RyaW5nID0gcGVyY2VudCArIFwiJVwiO1xyXG4gICAgICAgIG9iamVjdC5wcm9ncmVzcy5wcm9ncmVzcyA9IHBlcmNlbnQgLyAxMDA7XHJcbiAgICAgICAgb2JqZWN0LmhwID0gaW5mby5ocDtcclxuICAgICAgICBvYmplY3QucGFzc19pY29uLmFjdGl2ZSA9IGluZm8uaHAgPT0gMDtcclxuICAgICAgICBvYmplY3QuYm9zc19pY29uLnNldFZpc2libGUoaW5mby5ocCAhPSAwKTtcclxuICAgICAgICBvYmplY3QubW9uc3Rlcl9uYW1lLm5vZGUuYWN0aXZlID0gaW5mby5ocCAhPSAwO1xyXG4gICAgICAgIG9iamVjdC5wcm9ncmVzc19jb250YWluZXIuYWN0aXZlID0gaW5mby5ocCAhPSAwO1xyXG4gICAgfSxcclxuXHJcbiAgICBkb3VibGVUaW1lQWN0aW9uOiBmdW5jdGlvbiAoYm9vbCkge1xyXG4gICAgICAgIGlmIChib29sID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvdWJsZVJld2FyZC5zdG9wQWxsQWN0aW9ucygpO1xyXG4gICAgICAgICAgICBpZiAoVXRpbHMubmV4dCh0aGlzLl9kb3VibGVSZXdhcmRMaXN0KSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuX2RvdWJsZVJld2FyZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5fZG91YmxlUmV3YXJkW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHYuc2V0U3BlY2lhbENvbG9yKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdi5zZXRTcGVjaWFsTnVtKHRoaXMuX2N1cnJlbnRQYXNzTnVtW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB2LnNldERvdWJsZUljb24oZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RvdWJsZVJld2FyZC5hY3RpdmUgPSBib29sO1xyXG4gICAgICAgIHZhciBzZXEgPSBjYy5zZXF1ZW5jZShjYy5mYWRlT3V0KDEuMCksIGNjLmZhZGVJbigxLjApLCBjYy5kZWxheVRpbWUoMC4zKSk7XHJcbiAgICAgICAgdGhpcy5fZG91YmxlUmV3YXJkLnJ1bkFjdGlvbihjYy5yZXBlYXRGb3JldmVyKHNlcSkpO1xyXG5cclxuICAgICAgICBpZiAoVXRpbHMubmV4dCh0aGlzLl9kb3VibGVSZXdhcmRMaXN0KSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5fZG91YmxlUmV3YXJkTGlzdCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLl9kb3VibGVSZXdhcmRMaXN0W2ldO1xyXG4gICAgICAgICAgICAgICAgLy8gdi5zZXRTcGVjaWFsQ29sb3IodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAvLyB2LnNldFNwZWNpYWxOdW0odGhpcy5fZG91YmxlUGFzc051bVtpXSk7XHJcbiAgICAgICAgICAgICAgICAvLyB2LnNldERvdWJsZUljb24odHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8v6K6+572u54mp5ZOB5aWW5YqxXHJcbiAgICAvL2Rwc19hd2FyZDrkvKTlrrPlpZblirHliJfooahcclxuICAgIC8vZml4ZWRfYXdhcmQ65Zu65a6a5aWW5Yqx5YiX6KGoXHJcbiAgICAvL2d1aWxkX2F3YXJkOuWFrOS8mui0oeeMrueJueauilxyXG4gICAgdXBkYXRlRmlsbFJld2FyZHNJdGVtczogZnVuY3Rpb24gKGRwc19hd2FyZCwgZml4ZWRfYXdhcmQsIGd1aWxkX2F3YXJkKSB7XHJcbiAgICAgICAgZHBzX2F3YXJkID0gZHBzX2F3YXJkIHx8IHt9O1xyXG4gICAgICAgIF9maXhlZF9hd2FyZCA9IGZpeGVkX2F3YXJkIHx8IFtdO1xyXG4gICAgICAgIHZhciBfZml4ZWRfYXdhcmQgPSBVdGlscy5kZWVwQ29weShmaXhlZF9hd2FyZCk7XHJcbiAgICAgICAgZ3VpbGRfYXdhcmQgPSBndWlsZF9hd2FyZCB8fCAwO1xyXG4gICAgICAgIF9maXhlZF9hd2FyZC5wdXNoKFtnZGF0YShcIml0ZW1fZGF0YVwiLCBcImRhdGFfYXNzZXRzX2xhYmVsMmlkXCIsIFwiZ3VpbGRfZXhwXCIpLCBndWlsZF9hd2FyZF0pO1xyXG4gICAgICAgIC8vIGZvciAodmFyIGkgaW4gdGhpcy5pdGVtX2xpc3QpIHtcclxuICAgICAgICAvLyAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1fbGlzdFtpXTtcclxuICAgICAgICAvLyAgICAgaXRlbS5zZXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5pdGVtX3Bvb2wucHVzaChpdGVtKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gdGhpcy5pdGVtX2xpc3QgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuaXRlbV9saXN0XzEpIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1fbGlzdF8xW2ldO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5zZXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuaXRlbV9saXN0XzIpIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1fbGlzdF8yW2ldO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5zZXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGl0ZW1fY29uZmlnID0gbnVsbDtcclxuICAgICAgICB2YXIgaW5kZXggPSAxO1xyXG4gICAgICAgIC8vIHZhciBiYWNrcGFja19pdGVtID0gbnVsbDtcclxuICAgICAgICB2YXIgX3ggPSAwO1xyXG4gICAgICAgIHZhciBfeSA9IC0zMzk7XHJcbiAgICAgICAgdmFyIHNjYWxlID0gMC44O1xyXG4gICAgICAgIHZhciBkZXNjID0gbnVsbDtcclxuICAgICAgICAvL+iuvue9ruS8pOWus+WlluWKsVxyXG4gICAgICAgIGZvciAodmFyIGkgaW4gZHBzX2F3YXJkKSB7XHJcbiAgICAgICAgICAgIHZhciB2ID0gZHBzX2F3YXJkW2ldO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtX2xpc3RfMVtpbmRleF0gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYmFja3BhY2tfaXRlbSA9IEl0ZW1zUG9vbC5nZXRJbnN0YW5jZSgpLmdldEl0ZW0oXCJiYWNrcGFja19pdGVtXCIpO1xyXG4gICAgICAgICAgICAgICAgYmFja3BhY2tfaXRlbS5pbml0Q29uZmlnKGZhbHNlLCBzY2FsZSwgZmFsc2UsIHRydWUpXHJcbiAgICAgICAgICAgICAgICBiYWNrcGFja19pdGVtLnNldFBhcmVudCh0aGlzLm1haW5fcGFuZWwpO1xyXG4gICAgICAgICAgICAgICAgYmFja3BhY2tfaXRlbS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1fbGlzdF8xW2luZGV4XSA9IGJhY2twYWNrX2l0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGJhY2twYWNrX2l0ZW0gPSB0aGlzLml0ZW1fbGlzdF8xW2luZGV4XVxyXG4gICAgICAgICAgICAvLyBiYWNrcGFja19pdGVtID0gdGhpcy5pdGVtX3Bvb2wuc2hpZnQoKTtcclxuICAgICAgICAgICAgYmFja3BhY2tfaXRlbS5zZXRWaXNpYmxlKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgX3ggPSAxMDAgKyAoaW5kZXggLSAxKSAqIChCYWNrUGFja0l0ZW0uV2lkdGggKiBzY2FsZSArIDE0KSArIEJhY2tQYWNrSXRlbS5XaWR0aCAqIHNjYWxlICogMC41IC0gMzM1O1xyXG4gICAgICAgICAgICAvLyBiYWNrcGFja19pdGVtLnNldERlZmF1bHRUaXAoKTtcclxuXHJcbiAgICAgICAgICAgIGJhY2twYWNrX2l0ZW0uc2V0UG9zaXRpb24oX3gsIF95KTtcclxuICAgICAgICAgICAgYmFja3BhY2tfaXRlbS5zZXREYXRhKHsgYmlkOiB2WzBdLCBudW06IHZbMV0gfSk7XHJcbiAgICAgICAgICAgIGlmICh2WzFdID49IDEwMDApIHtcclxuICAgICAgICAgICAgICAgIGRlc2MgPSBjYy5qcy5mb3JtYXRTdHIoXCIlc0tcIiwgTWF0aC5mbG9vcih2WzFdICogMC4wMDEpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRlc2MgPSB2WzFdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh2WzJdKSB7XHJcbiAgICAgICAgICAgICAgICBkZXNjID0gZGVzYztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBiYWNrcGFja19pdGVtLnNldFNwZWNpYWxOdW0oZGVzYyk7XHJcbiAgICAgICAgICAgIC8vIGJhY2twYWNrX2l0ZW0uc2V0U3BlY2lhbENvbG9yKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRQYXNzTnVtW2ldID0gZGVzYztcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fZG91YmxlUmV3YXJkTGlzdFtpXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZG91YmxlUmV3YXJkTGlzdFtpXSA9IGJhY2twYWNrX2l0ZW07XHJcbiAgICAgICAgICAgICAgICB2YXIgZG91YmxlRGVzYyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAodlsxXSAqIDIgPj0gMTAwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvdWJsZURlc2MgPSBjYy5qcy5mb3JtYXRTdHIoXCIlc0tcIiwgTWF0aC5mbG9vcih2WzFdICogMiAqIDAuMDAxKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvdWJsZURlc2MgPSB2WzFdICogMjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh2WzJdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG91YmxlRGVzYyA9IGRvdWJsZURlc2M7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kb3VibGVQYXNzTnVtW2ldID0gZG91YmxlRGVzYztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyB0aGlzLml0ZW1fbGlzdC5wdXNoKGJhY2twYWNrX2l0ZW0pO1xyXG4gICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKEFjdGl2aXR5Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEJvc3NBY3Rpdml0eURvdWJsZVRpbWUoKSA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZG91YmxlVGltZUFjdGlvbih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy/orr7nva7lh7vmnYDlpZblirFcclxuICAgICAgICBpbmRleCA9IDE7XHJcbiAgICAgICAgLy8gYmFja3BhY2tfaXRlbSA9IG51bGw7XHJcbiAgICAgICAgZm9yICh2YXIgaSBpbiBfZml4ZWRfYXdhcmQpIHtcclxuICAgICAgICAgICAgdmFyIHYgPSBfZml4ZWRfYXdhcmRbaV07XHJcbiAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgQXJyYXkgJiYgdlswXSAmJiB2WzFdKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pdGVtX2xpc3RfMltpbmRleF0gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2twYWNrX2l0ZW0gPSBJdGVtc1Bvb2wuZ2V0SW5zdGFuY2UoKS5nZXRJdGVtKFwiYmFja3BhY2tfaXRlbVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBiYWNrcGFja19pdGVtLmluaXRDb25maWcoZmFsc2UsIHNjYWxlLCBmYWxzZSwgdHJ1ZSlcclxuICAgICAgICAgICAgICAgICAgICBiYWNrcGFja19pdGVtLnNldFBhcmVudCh0aGlzLm1haW5fcGFuZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJhY2twYWNrX2l0ZW0uc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9saXN0XzJbaW5kZXhdID0gYmFja3BhY2tfaXRlbTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBiYWNrcGFja19pdGVtID0gdGhpcy5pdGVtX2xpc3RfMltpbmRleF07XHJcbiAgICAgICAgICAgICAgICAvLyBiYWNrcGFja19pdGVtID0gdGhpcy5pdGVtX3Bvb2wuc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgIGJhY2twYWNrX2l0ZW0uc2V0VmlzaWJsZSh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBfeCA9IDEwMCArIChpbmRleCAtIDEpICogKEJhY2tQYWNrSXRlbS5XaWR0aCAqIHNjYWxlICsgMTQpICsgQmFja1BhY2tJdGVtLldpZHRoICogc2NhbGUgKiAwLjUgLSAyMztcclxuICAgICAgICAgICAgICAgIC8vIGJhY2twYWNrX2l0ZW0uc2V0RGVmYXVsdFRpcCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGJhY2twYWNrX2l0ZW0uc2V0UG9zaXRpb24oX3gsIF95KTtcclxuICAgICAgICAgICAgICAgIGJhY2twYWNrX2l0ZW0uc2V0RGF0YSh7IGJpZDogdlswXSwgbnVtOiB2WzFdIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtX2xpc3QucHVzaChiYWNrcGFja19pdGVtKTtcclxuICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+abtOaWsOe6oueCuVxyXG4gICAgdXBkYXRlU29tZVJlZFN0YXR1czogZnVuY3Rpb24gKHR5cGUsIHN0YXR1cykge1xyXG5cclxuICAgIH0sXHJcblxyXG4gICAgZ2V0VHlwZTogZnVuY3Rpb24gKGluZGV4KSB7XHJcbiAgICAgICAgaWYgKGluZGV4ID09IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIEd1aWxkQm9zc0NvbnN0LnR5cGUucGh5c2ljcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gR3VpbGRCb3NzQ29uc3QudHlwZS5tYWdpYztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuXHJcbiAgICBjbG9zZUNhbGxCYWNrOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYm9zc19pY29uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYm9zc19pY29uLmRlbGV0ZU1lKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYm9zc19pY29uID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2RvdWJsZVJld2FyZExpc3QpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLl9kb3VibGVSZXdhcmRMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuX2RvdWJsZVJld2FyZExpc3RbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAodi5kZWxldGVNZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHYuZGVsZXRlTWUoKTtcclxuICAgICAgICAgICAgICAgICAgICB2ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9kb3VibGVSZXdhcmRMaXN0ID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHRoaXMuY2xlYXJUaW1lVGlja2V0KCk7XHJcbiAgICAgICAgdGhpcy5jbGVhckJ1ZmZUaW1lVGlja2V0KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1vbnN0ZXJfbGlzdCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMubW9uc3Rlcl9saXN0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMubW9uc3Rlcl9saXN0W2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKHYuc3BpbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICB2LnNwaW5lLmRlbGV0ZU1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdi5zcGluZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5tb25zdGVyX2xpc3QgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgKHRoaXMuaXRlbV9saXN0KSB7XHJcbiAgICAgICAgLy8gICAgIGZvciAodmFyIGkgaW4gdGhpcy5pdGVtX2xpc3QpIHtcclxuICAgICAgICAvLyAgICAgICAgIHZhciB2ID0gdGhpcy5pdGVtX2xpc3RbaV07XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAodi5kZWxldGVNZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHYuZGVsZXRlTWUoKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICB2ID0gbnVsbDtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vICAgICB0aGlzLml0ZW1fbGlzdCA9IG51bGw7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGZvciAodmFyIGkgaW4gdGhpcy5pdGVtX3Bvb2wpIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5pdGVtX3Bvb2xbaV0uZGVsZXRlTWUoKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5pdGVtX3Bvb2xbaV0gPSBudWxsO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyB0aGlzLml0ZW1fcG9vbCA9IG51bGw7XHJcblxyXG5cclxuICAgICAgICBpZiAodGhpcy5pdGVtX2xpc3RfMikge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuaXRlbV9saXN0XzIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLml0ZW1fbGlzdF8yW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtX2xpc3RfMltpXS5kZWxldGVNZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9saXN0XzJbaV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbV9saXN0XzIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiAodGhpcy5pdGVtX2xpc3RfMSkge1xyXG4gICAgICAgIC8vICAgICBmb3IgKHZhciBpIGluIHRoaXMuaXRlbV9saXN0XzEpIHtcclxuICAgICAgICAvLyAgICAgICAgIGlmICh0aGlzLml0ZW1fbGlzdF8xW2ldKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5pdGVtX2xpc3RfMVtpXS5kZWxldGVNZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuaXRlbV9saXN0XzFbaV0gPSBudWxsO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICAgIHRoaXMuaXRlbV9saXN0XzEgPSBudWxsO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgdGhpcy5tdXN0ZXJfYnRuX2xhYmVsLm5vZGUuc3RvcEFsbEFjdGlvbnMoKVxyXG5cclxuICAgICAgICBpZiAodGhpcy5ndWlsZF9ib3NzX3ZpZXcpIHtcclxuICAgICAgICAgICAgdGhpcy5ndWlsZF9ib3NzX3ZpZXcuZGVsZXRlTWUoKTtcclxuICAgICAgICAgICAgdGhpcy5ndWlsZF9ib3NzX3ZpZXcgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucm9sZV92byAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfYXNzZXRzX2V2ZW50ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm9sZV92by51bmJpbmQodGhpcy5yb2xlX2Fzc2V0c19ldmVudCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGVfYXNzZXRzX2V2ZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnJvbGVfdm8gPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jdHJsLm9wZW5NYWluV2luZG93KGZhbHNlKVxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEd1aWxkQm9zc01haW5XaW5kb3c7Il19