1if (!window.location.origin) { 2 window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port : ''); 3} 4// define jQuery 5jQuery(function ($) { 6 'use strict'; 7 var accordion = { 8 9 init: function () { 10 // accordion 11 //$('.accordion ul li h3').on('click', function () { 12 $('.accordion button').on('click', function () { 13 14 $(this).toggleClass('active'); 15 $(this).next().slideToggle('400'); 16 }); 17 } 18 }; 19 var contactOptions = { 20 21 elemContact: '.ddlContact', 22 elemDivision: '.ddlDivision', 23 allContacts: null, 24 25 reset: function () { 26 27 var blank = $(this.elemContact + ' option').first(); 28 $(this.elemContact + ' option').remove(); 29 blank.appendTo(this.elemContact); 30 }, 31 32 bind: function () { 33 34 $(this.elemDivision).on('change', function () { 35 contactOptions.reset(); 36 var sel = $(this).find(':selected').val(); 37 //TODO: streamline this function 38 var opts = contactOptions.allContacts.filter(function (index) { 39 return (index === 0 || $(this).attr('class') === sel); 40 }); 41 $.each(opts, function (i, j) { 42 $(j).appendTo(contactOptions.elemContact); 43 }); 44 //$(contactOptions.elemContact + ' option').first().attr("selected", "selected"); 45 }); 46 }, 47 48 init: function () { 49 this.allContacts = $(this.elemContact + ' option'); 50 this.reset(); 51 this.bind(); 52 } 53 }; 54 var btt = { 55 56 bind: function () { 57 58 $(document).on('click touch', '#btt', function (e) { 59 e.preventDefault; 60 $('html, body').animate({ scrollTop: 0 }, 700); 61 return false; 62 }); 63 }, 64 65 eventListeners: function () { 66 67 $(window).scroll(function () { 68 69 $('#btt').css('bottom', Math.max(30, $('footer').outerHeight() - ($(document).height() - $(window).scrollTop() - $(window).height()))); 70 71 if ($(window).scrollTop() > 200) { 72 $('#btt').fadeIn(300); 73 } 74 else { 75 $('#btt').fadeOut(300); 76 } 77 78 }); 79 80 }, 81 82 init: function () { 83 84 $('#btt').fadeOut(300); 85 btt.bind(); 86 btt.eventListeners(); 87 } 88 }; 89 var burgerElems = { 90 91 elms: { 92 burgerButton: $('#burger-button') 93 }, 94 95 burgerFunction: function () { 96 burgerElems.elms.burgerButton.on('click', function (e) { 97 e.preventDefault(); 98 $(this).toggleClass('is-active'); 99 $('#main').toggleClass('overlay'); 100 $('.nav-wrapper').toggleClass('mbl-active'); 101 if ($(this).hasClass('is-active')) { 102 $('.global-sub').removeClass('is-active'); 103 $('.global-sub-nav.is-active').slideToggle('400').removeClass('is-active'); 104 } 105 }); 106 }, 107 108 eventListeners: function () { 109 if ($('#burger-button').length > 0) { 110 burgerElems.burgerFunction(); 111 } 112 }, 113 init: function () { 114 burgerElems.eventListeners(); 115 } 116 }; 117 var contentNav = { 118 119 $window: $(window), 120 121 desktopWidth: 1280, 122 123 mobile: { 124 125 $toggle: $('.content-nav.mobile-nav .mbl-content-nav'), 126 proxyToggle: null, 127 isListening: false, 128 129 init: function () { 130 this.proxyToggle = $.proxy(this.toggleHandler, this); 131 }, 132 133 listen: function () { 134 if (!this.isListening) { 135 this.isListening = true; 136 this.$toggle.on('click touch', this.proxyToggle); 137 } 138 }, 139 140 cancel: function () { 141 if (this.isListening) { 142 this.isListening = false; 143 this.$toggle.off('click touch', this.proxyToggle); 144 } 145 }, 146 147 toggleHandler: function (e) { 148 e.preventDefault(); 149 $(e.target).toggleClass('is-active'); 150 } 151 }, 152 153 154 desktop: { 155 $toggle: $('.content-nav.desktop-nav .dropdown'), 156 157 proxyToggle: null, 158 isListening: false, 159 160 init: function () { 161 this.proxyToggle = $.proxy(this.toggleHandler, this); 162 163 $(".content-nav.desktop-nav .sub-nav li").addClass("is-active"); 164 }, 165 166 listen: function () { 167 168 if (!this.isListening) { 169 this.isListening = true; 170 this.$toggle.on('click touch', this.proxyToggle); 171 } 172 }, 173 174 cancel: function () { 175 if (this.isListening) { 176 this.isListening = false; 177 this.$toggle.off('click touch', this.proxyToggle); 178 } 179 }, 180 181 toggleHandler: function (e) { 182 183 184 var $el = $(e.target); 185 var $drop = $el.closest('.dropdown'); 186 // var isActive = $drop.hasClass('is-active'); 187 188 if (!$el.is('a') && !$el.hasClass('toggle')) { 189 // console.log('first if condition') 190 e.preventDefault(); 191 if($el.hasClass('sub-nav-dropdown')) { 192 // console.log('arrow is clicked'); 193 $el.siblings('a').toggleClass('active'); 194 } 195 else { 196 $el.toggleClass('is-active'); 197 } 198 } 199 else if ($el.hasClass('toggle')) { 200 const listIndex = $(e.target).parent().index()-1; 201 // console.log(this.$toggle[listIndex]) 202 this.$toggle[listIndex].classList.toggle('is-active'); 203 } 204 } 205 }, 206 207 208 init: function () { 209 this.desktop.init(); 210 this.mobile.init(); 211 212 this.$window.on('resize orientationchange', $.proxy(this.resize, this)); 213 this.resize(); 214 }, 215 216 217 resize: function () { 218 if (this._getInnerWidth() >= this.desktopWidth) { 219 this.desktop.listen(); 220 this.mobile.cancel(); 221 } 222 else { 223 this.mobile.listen(); 224 this.desktop.cancel(); 225 } 226 }, 227 228 _getInnerWidth: function () { 229 return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 230 } 231 232 }; 233 234 235 236 /* globals Foundation: false */ 237 var footerPos = { 238 239 elms: { 240 footer: $('footer'), 241 body: $('body') 242 }, 243 244 footerFunction: function () { 245 246 }, 247 248 eventListeners: function () { 249 var footerHeight = footerPos.elms.footer.height() + 80; 250 var bodyHeight = footerPos.elms.body.height(); 251 var windowHeight = $(window).height(); 252 253 if (Foundation.MediaQuery.atLeast('medium')) { 254 $('#main').css('padding-bottom', footerHeight); 255 if (bodyHeight < windowHeight) { 256 $('body').addClass('ftr-fix'); 257 } 258 } 259 }, 260 init: function () { 261 footerPos.eventListeners(); 262 } 263 }; 264 var headerScroll = { 265 266 elms: { 267 268 }, 269 270 headerFunction: function () { 271 272 }, 273 274 eventListeners: function () {
275 //caches a jQuery object containing the header element 276 var body = $('body'); 277 var header = $('header'); 278 var headerHeight = header.height(); 279 $(window).scroll(function () { 280 var scroll = $(window).scrollTop(); 281 282 if (scroll >= 100) { 283 body.addClass('sticky-header'); 284 } else { 285 body.removeClass('sticky-header'); 286 } 287 }); 288 }, 289 init: function () { 290 headerScroll.eventListeners(); 291 } 292 }; 293 /* globals doT: false */ 294 var historyTimeline = { 295 296 renderTemplate: null, 297 template: '{{~ it :i}}<div class="year"><div class="midline"></div><span class="ylabel">{{=i.year}}</span>{{~ i.items :i}}<a href="{{=i.Url}}" class="day {{=i.positionOverride}}"><div class="wrapper {{? !i.Image }}no-image{{?}}">{{? i.Image }}<div class="image {{=i.Class}}"><img src="{{=i.Image}}" /></div>{{?}}<div class="copy"><span class="tag">{{=i.Category}}</span><h2>{{=i.Title}}</h2><span class="date">{{=i.Moment.format("MMM YYYY")}}</span></div></div></a>{{~}}</div>{{~}}', 298 299 renderData: function (timeline, data, queryCategory) { 300 if (queryCategory) { 301 var ret = []; 302 $(data).each(function (i, d) { 303 if (d.Category === queryCategory) { 304 ret.push(d); 305 } 306 }); 307 data = ret; 308 } else { 309 310 } 311 312 var groups = {}; 313 $.each(data, function (i, item) { 314 item.Moment = moment(item.Date, 'DD/MM/YYYY', true); 315 var year = item.Moment.year(); 316 //console.log(year); 317 if (groups[year]) { 318 groups[year].push(item); 319 } else { 320 groups[year] = [item]; 321 } 322 }); 323 324 var dataByYear = $.map(groups, function (itemsForYear, year) { 325 return { 326 year: year, 327 items: itemsForYear 328 }; 329 }); 330 var layoutClass = 'center-left'; 331 $.each(groups, function (k, v) { 332 if ($(this).length < 2) { 333 var retClass = setClass(); 334 } 335 v[0].positionOverride = retClass; 336 }); 337 338 function setClass() { 339 340 if (layoutClass === 'center-left') { 341 layoutClass = 'center-right'; 342 } 343 else { 344 layoutClass = 'center-left'; 345 } 346 return layoutClass; 347 348 } 349 dataByYear.sort(function (a, b) { 350 if (a.year > b.year) { 351 return -1; 352 } else if (a.year < b.year) { 353 return 1; 354 } else { 355 return 0; 356 } 357 358 }); 359 //append the html 360 var result = this.renderTemplate(dataByYear); 361 $('.timeline', timeline).append(result); 362 //ensure all the heights of the pods match 363 timeline.imagesLoaded().always(function (instance) { 364 timeline.find(".year .day .wrapper").matchHeight(); 365 }); 366 367 368 }, 369 buildFilter: function (timeline, data) { 370 var categories = []; 371 372 $.each(data, function (index, value) { 373 if ($.inArray(value.Category, categories) == -1) { 374 //var insert = '<a href="#">' + value.Category + '</a>'; 375 categories.push(value.Category); 376 } 377 }); 378 var cList = $('.timeline-filter'); 379 $.each(categories, function (i) { 380 var filterBtn = $('<a/>').text(categories[i]).attr('data-name', categories[i]).attr('class', 'filter-btn').attr('href', '?cat=' + categories[i]).appendTo(cList); 381 var filterOptions = $('<option>').text(categories[i]).attr('data-path', '?cat=' + categories[i]).appendTo('.mbl-filter'); 382 }); 383 $('.filter-btn').each(function () { 384 var pageQuery = window.location.search.substring(1).split('='); 385 var queryCategory = pageQuery[1]; 386 if ($(this).data('name') == queryCategory) { 387 $('.filter-btn').removeClass('active'); 388 $(this).addClass('active'); 389 } 390 }); 391 }, 392 disable: function (timeline) { 393 //$('.load-more', timeline).hide(); 394 }, 395 filterCategory: function (catagoryName) { 396 397 }, 398 399 init: function () { 400 this.initTemplates(); 401 this.initEvents(); 402 }, 403 404 initTemplates: function () { 405 this.renderTemplate = doT.template(this.template); 406 }, 407 408 initEvents: function () { 409 var pageQuery = window.location.search.substring(1).split('='); 410 411 var queryCategory = pageQuery[1]; 412 // if(document.location.search.length) { 413 // if (queryCategory !== '') { 414 // $('.timeline').removeClass('show-all'); 415 // } 416 // } else { 417 // // no query string exists 418 // } 419 420 421 $('[data-history]').each(function (i, timeline) { 422 423 var timeline = $(timeline); 424 425 var loadUrl = timeline.data('url'); 426 $.ajax({
427 url: loadUrl, 428 type: 'GET', 429 dataType: 'json', 430 success: function (data) { 431 historyTimeline.renderData(timeline, data, queryCategory); 432 historyTimeline.buildFilter(timeline, data); 433 }, 434 error: function () { 435 console.log('Could not load content.'); 436 } 437 }); 438 }); 439 //had to add js function for anchor onclick - fixes a bug in small screen 440 $(document).on('click', 'a.filter-btn', function (e) { 441 window.location = window.location.origin + window.location.pathname + $(this).attr('href'); 442 e.preventDefault(); 443 }); 444 //Mobile drop down version 445 $('.mbl-filter').on('change', function () { 446 var dataID = $(this).find(':selected').val(); 447 window.location = window.location.origin + window.location.pathname + $(this).find(':selected').attr('data-path'); 448 }); 449 } 450 }; 451 452 var gmap = { 453 454 init: function () { 455 // handles google maps 456 if ($('.g-map').length > 0) { 457 var pinSmall = '/assets/img/icons/icon-pin.png'; 458 $('.g-map').each(function () { 459 var myCenter = new google.maps.LatLng($(this).data('lat'), $(this).data('lon')); 460 var locationElement = $(this)[0]; 461 function initialize() { 462 var mapProp = { 463 center: myCenter, 464 zoom: 17, 465 mapTypeId: google.maps.MapTypeId.ROADMAP 466 }; 467 var map = new google.maps.Map(locationElement, mapProp); 468 var marker = new google.maps.Marker({ 469 icon: pinSmall, 470 position: myCenter 471 }); 472 marker.setMap(map); 473 } 474 google.maps.event.addDomListener(window, 'load', initialize); 475 }); 476 } 477 } 478 479 }; 480 var matchHeightElms = { 481 482 elms: { 483 promoBox: $('.promo') 484 }, 485 486 matchHeightFunction: function () { 487 $('.promo').matchHeight(); 488 }, 489 490 eventListeners: function () { 491 if ($('.promo').length > 0) { 492 matchHeightElms.matchHeightFunction(); 493 } 494 }, 495 496 init: function () { 497 matchHeightElms.eventListeners(); 498 // filters min height 499 if ($('.filter-wrapper').length > 0) { 500 var groupMinHeight = $('.group-select').height(); 501 $('.group').css('min-height', groupMinHeight); 502 } 503 } 504 }; 505 var mobileNav = { 506 $window: $(window), 507 $main: $('#main'), 508 $columns: $('nav .global-sub .columns'), 509 510 $burgerBtn: $('#burger-button'), 511 $mblBack: $('nav .mbl-back'), 512 $globalSub: $('nav .global-sub'), 513 $navWrapper: $('.nav-wrapper'), 514 515 $btns: $('nav .global > li > a, .util > li > a'), 516 $btnsExpand: $('nav .global-sub .sub-title'), 517 $btnsSubExpand: $('nav .global-sub-nav .sub-nav a'), 518 $subExpand: $('nav .global-sub-nav .sub-nav'), 519 $searchField: $('nav .global-search #gbl-srch, nav .global-search #gbl-srch-sbmt'), 520 521 desktopWidth: 1280, 522 proxyClick: null, 523 proxyToggleExpand: null, 524 proxyClose: null, 525 proxyBack: null, 526 proxySubToggleExpand: null, 527 proxyFocus: null, 528 529 activeClass: 'is-active', 530 531 isListening: false, 532 533 init: function () { 534 this.proxyToggleExpand = $.proxy(this.toggleExpand, this); 535 this.proxyClick = $.proxy(this.click, this); 536 this.proxyClose = $.proxy(this.close, this); 537 this.proxyBack = $.proxy(this.back, this); 538 this.proxySubToggleExpand = $.proxy(this.subToggleExpand, this); 539 this.proxyFocus = $.proxy(this.focus, this); 540 541 this.$window.on('resize orientationchange', $.proxy(this.resize, this)); 542 543 this.resize(); 544 }, 545 546 547 focus: function (e) { 548 // stop tab focus outside of navigation being open 549 if (e.keyCode === 9 && !this.$navWrapper.hasClass('mbl-active')) { 550 e.preventDefault(); 551 } 552 }, 553 554 resize: function () { 555 if (this._getInnerWidth() < this.desktopWidth) { 556 this.listen(); 557 } 558 else { 559 this.cancel(); 560 this.close(); 561 } 562 }, 563 564 listen: function () { 565 if (!this.isListening) { 566 this.isListening = true; 567 this.$btns.on('click touch', this.proxyClick); 568 this.$btnsExpand.on('click touch', this.proxyToggleExpand); 569 this.$mblBack.on('click touch', this.proxyBack); 570 this.$main.on('click touch', this.proxyClose); 571 this.$btnsSubExpand.on('click touch', this.proxySubToggleExpand); 572 this.$window.on('keydown', this.proxyFocus); 573 } 574 }, 575 576 cancel: function () { 577 if (this.isListening) { 578 this.isListening = false; 579 this.$btns.off('click touch', this.proxyClick); 580 this.$btnsExpand.off('click touch', this.proxyToggleExpand); 581 this.$mblBack.off('click touch', this.proxyBack); 582 this.$main.off('click touch', this.proxyClose); 583 this.$btnsSubExpand.off('click touch', this.proxySubToggleExpand); 584 //this.$searchField.off('focus', this.proxyFocus); 585 this.$window.off('keydown', this.proxyFocus); 586 } 587 }, 588 589 back: function (e) { 590 e.preventDefault(); 591 this.$globalSub.removeClass(this.activeClass); 592 this.$columns.removeClass(this.activeClass); 593 }, 594 595 close: function (e) { 596 if (e !== undefined && this.$navWrapper.hasClass('mbl-active')) { e.preventDefault(); } 597 this.$burgerBtn.removeClass(this.activeClass); 598 this.$navWrapper.removeClass('mbl-active'); 599 this.$main.removeClass('overlay'); 600 this.$columns.removeClass(this.activeClass); 601 this.$subExpand.removeClass(this.activeClass); 602 }, 603 604 click: function (e) { 605 606 var $target = $(e.target), 607 $parent = $target.closest('li'), 608 $el = $target.next('.global-sub'); 609 if (!$el.hasClass(this.activeClass)) { 610 $el.addClass(this.activeClass); 611 } 612 if (!$parent.hasClass('exc')) { 613 e.preventDefault(); 614 return false; 615 } 616 }, 617 618 toggleExpand: function (e) { 619 e.preventDefault(); 620 var $target = $(e.target), 621 $parent = $target.closest('.columns'), 622 isActive = $parent.hasClass(this.activeClass); 623 // close any active sub menus 624 this.$columns.removeClass(this.activeClass); 625 // open 626 if (!isActive) { 627 $parent.addClass(this.activeClass); 628 } 629 }, 630 631 subToggleExpand: function (e) { 632 e.preventDefault(); 633 var $target = $(e.target), 634 $parent = $target.closest('.sub-nav'), 635 isActive = $parent.hasClass(this.activeClass); 636 // close any active sub menus 637 this.$subExpand.removeClass(this.activeClass); 638 // open 639 if (!isActive) { 640 $parent.addClass(this.activeClass); 641 } 642 643 }, 644 645 _getInnerWidth: function () { 646 return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 647 } 648 }; 649 var navOverlay = { 650 651 $window: $(window), 652 $body: $('body'), 653 $main: $('#main'), 654 desktopWidth: 1280, 655 classes: '.in-large .global > li:not(.exc), .in-large .util > li:not(.exc)', 656 $el: $('.in-large .global > li:not(.exc), .in-large .util > li:not(.exc)'), 657 overlayClassname: 'overlay', 658 proxyToggle: null, 659 resizeProxy: null, 660 isListening: false, 661 662 init: function () { 663 this.proxyToggle = $.proxy(this.toggleOverlay, this); 664 this.resizeProxy = $.proxy(this.resize, this); 665 this.$window.on('resize orientationchange', this.resizeProxy); 666 667 this.resize(); 668 }, 669 670 resize: function () { 671 if (this._getInnerWidth() >= this.desktopWidth) { 672 this.listen(); 673 } 674 else { 675 this.cancel(); 676 } 677 }, 678 679 listen: function () { 680 if (!this.isListening) { 681 this.isListening = true; 682 this.$el.on('mouseover', this.proxyToggle); 683 this.$el.on('mouseleave', this.proxyToggle); 684 } 685 }, 686 687 cancel: function () { 688 if (this.isListening) { 689 this.isListening = false; 690 this.$el.off('mouseover', this.proxyToggle); 691 this.$el.off('mouseleave', this.proxyToggle); 692 this.$main.removeClass(this.overlayClassname); 693 } 694 }, 695 696 toggleOverlay: function (e) { 697 if (e.type == 'mouseover') { 698 this.$main.addClass(this.overlayClassname); 699 } 700 else { 701 this.$main.removeClass(this.overlayClassname); 702 } 703 }, 704 705 706 _getInnerWidth: function () { 707 return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 708 }, 709 710 }; 711 var socialFeed = { 712 713 init: function () { 714 $('.social-feed-container').socialfeed({ 715 // FACEBOOK 716 // facebook:{ 717 // accounts: ['@james.burnage.1'], //Array: Specify a list of accounts from which to pull wall posts 718 // limit: 2, //Integer: max number of posts to load 719 // access_token: '151427878576646|3b9addff68d31adbce8dce001
719512a024' //String: "APP_ID|APP_SECRET" 720 // }, 721 722 // TWITTER 723 twitter: { 724 accounts: ['@WesfarmersArts', '@Wesfarmers'], //Array: Specify a list of accounts from which to pull tweets 725 limit: 2, //Integer: max number of tweets to load 726 consumer_key: 'Q4zFXZwmO2uD1Ru4aCilYwTnB', //String: consumer key. make sure to have your app read-only 727 consumer_secret: 'iTzc234DGCNprwXkDkS0xQcc9nGkABTClQGOZ4er9Y7WkaMHur',//String: consumer secret key. make sure to have your app read-only 728 }, 729 730 // VK 731 // vk:{ 732 // accounts: ['@125936523','#teslamotors'], //Array: Specify a list of accounts from which to pull posts 733 // limit: 2, //Integer: max number of posts to load 734 // source: 'all' //String: VK API post filter. Possible values: "Owner","Others","all","suggests" 735 // }, 736 737 // GOOGLEPLUS 738 // google:{ 739 // accounts: ['#teslamotors'], //Array: Specify a list of accounts from which to pull posts 740 // limit: 2, //Integer: max number of posts to load 741 // access_token: 'YOUR_GOOGLE_PLUS_ACCESS_TOKEN'//String: G+ access token 742 // }, 743 744 // INSTAGRAM 745 instagram: { 746 accounts: ['@wesfarmersarts'], //Array: Specify a list of accounts from which to pull posts 747 limit: 2, //Integer: max number of posts to load 748 client_id: 'a74146c788fb4729a5961dfa63ed9628', //String: Instagram client id (option if using access token)
749 access_token: '2980903097.1677ed0.64f3ea4924334a8aa3b208c7a507c366' //String: Instagram access token 750 }, 751 752 // PINTEREST 753 754 pinterest: { 755 accounts: ['@me'], //Array: Specify a list of accounts from which to pull posts 756 //@me to pull your pins 757 //@user/board to pull pins from a user board 758 limit: 2, //Integer: max number of posts to load 759 access_token: 'AVQMYZu0lSviPESW366xeRv2ip3xFDYqDE4mqCpC5JU6MuAv5wAAAAA' //String: Pinterest client id 760 }, 761 762 //RSS 763 rss: { 764 urls: ['https://www.smashingmagazine.com/feed/'], //Array: Specifiy a list of rss feed from which to pull posts 765 limit: 2 //Integer: max number of posts to load for each url 766 }, 767 768 // GENERAL SETTINGS 769 length: 400, //Integer: For posts with text longer than this length, show an ellipsis. 770 show_media: true, //Boolean: if false, doesn't display any post images 771 media_min_width: 300, //Integer: Only get posts with images larger than this value 772 //update_period: 5000, //Integer: Number of seconds before social-feed will attempt to load new posts. 773 template: "tweet.html", //String: Filename used to get the post template. 774 template_html: //String: HTML used for each post. This overrides the 'template' filename option 775 '<div class="social-feed-element {{? !it.moderation_passed}}hidden{{?}}" dt-create="{{=it.dt_create}}" social-feed-id = "{{=it.id}}"> \ 776 <div class="content"> \ 777 <a class="pull-left" href="{{=it.author_link}}" target="_blank"> \ 778 <img class="media-object" src="{{=it.author_picture}}"> \ 779 </a> \ 780 <div class="media-body"> \ 781 <p> \ 782 <i class="fa fa-{{=it.social_network}}"></i> \ 783 <span class="author-title">{{=it.author_name}}</span> \ 784 <span class="muted pull-right"> {{=it.time_ago}}</span> \ 785 </p> \ 786 <div class="text-wrapper"> \ 787 <p class="social-feed-text">{{=it.text}}</p> \ 788 </div> \ 789 </div> \ 790 </div> \ 791 {{=it.attachment}} \ 792 </div>', 793 794 795 //date_format: "LLL", //String: Display format of the date attribute (see http://momentjs.com/docs/#/displaying/format/) 796 moderation: function (content) { //Function: if returns false, template will have class hidden 797 return (content.text) ? content.text.indexOf('fuck') == -1 : true; 798 }, 799 callback: function () { //Function: This is a callback function which is evoked when all the posts are collected and displayed 800 console.log("All posts collected!"); 801 } 802 }); 803 804 // The .each() method is unnecessary here: 805 $(".twitter-feed").each(function () { 806 var twtHandle = $(this).data("handle"); 807 $(this).find('h2').text(twtHandle.substring(1)); // remove first char (replaced in css) 808 $(this).socialfeed({ 809 // TWITTER 810 twitter: { 811 accounts: [twtHandle], 812 //accounts: queryTags, //Array: Specify a list of accounts from which to pull tweets 813 limit: 4, //Integer: max number of tweets to load 814 consumer_key: 'Q4zFXZwmO2uD1Ru4aCilYwTnB', //String: consumer key. make sure to have your app read-only 815 consumer_secret: 'iTzc234DGCNprwXkDkS0xQcc9nGkABTClQGOZ4er9Y7WkaMHur',//String: consumer secret key. make sure to have your app read-only 816 }, 817 818 // GENERAL SETTINGS 819 length: 400, //Integer: For posts with text longer than this length, show an ellipsis. 820 show_media: true, //Boolean: if false, doesn't display any post images
821 media_min_width: 300, //Integer: Only get posts with images larger than this value 822 //update_period: 5000, //Integer: Number of seconds before social-feed will attempt to load new posts. 823 template: "tweet.html", //String: Filename used to get the post template. 824 template_html: //String: HTML used for each post. This overrides the 'template' filename option 825 '<div class="twitter-feed-element {{? !it.moderation_passed}}hidden{{?}}" dt-create="{{=it.dt_create}}" social-feed-id = "{{=it.id}}"> \ 826 <div class="content"> \ 827 <a href="{{=it.link}}" target="_blank"> \ 828 <div class="media-body"> \ 829 <p class="date-time">Post {{=it.time_ago}}</p> \ 830 <div class="text-wrapper"> \ 831 <p class="social-feed-text">{{=it.text}}</p> \ 832 </div> \ 833 </div> \ 834 </a> \ 835 </div> \ 836 </div>', 837 838 //date_format: "LLL", //String: Display format of the date attribute (see http://momentjs.com/docs/#/displaying/format/) 839 moderation: function (content) { //Function: if returns false, template will have class hidden 840 return (content.text) ? content.text.indexOf('fuck') == -1 : true; 841 }, 842 callback: function () { //Function: This is a callback function which is evoked when all the posts are collected and displayed 843 console.log("All posts collected!"); 844 } 845 }); 846 }); 847 848 } 849 }; 850 var stickyFooter = { 851 $window: $(window), 852 $body: $('body'), 853 $header: $('header'), 854 $main: $('#main'), 855 $wrapper: $('#wrapper'), 856 $footer: $('footer'), 857 858 desktopWidth: 1280, 859 proxyResize: null, 860 861 activeClass: 'is-active', 862 863 isListening: false, 864 865 init: function () { 866 this.proxyResize = $.proxy(this.resize, this); 867 this.listen(); 868 this.resize(); 869 }, 870 871 872 resize: function () { 873 var nH = this._getInnerHeight() - this.$footer.outerHeight(), 874 cH = this.$header.outerHeight(true) + this.$main.outerHeight(), 875 footerHeight = this.$footer.height(); 876 this.$body.height('100%'); 877 878 console.log(this.$header.height(), this.$header.outerHeight(true)); 879 if (nH > cH) { 880 if (!this.$footer.hasClass('sticky-footer')) { 881 this.$footer.addClass('sticky-footer'); 882 } 883 } 884 else { 885 if (this.$footer.hasClass('sticky-footer')) { 886 this.$footer.removeClass('sticky-footer'); 887 } 888 } 889 }, 890 891 listen: function () { 892 if (!this.isListening) { 893 this.isListening = true; 894 this.$window.on('resize orientationchange', this.proxyResize); 895 } 896 }, 897 898 cancel: function () { 899 if (this.isListening) { 900 this.isListening = false; 901 this.$window.off('resize orientationchange', this.proxyResize); 902 } 903 }, 904 905 906 _getInnerHeight: function () { 907 return window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; 908 } 909 910 }; 911 912 913 914 var stickyHeader = { 915 $window: $(window), 916 $body: $('body'), 917 //$header : $('header'), 918 desktopWidth: 1280, 919 lastWidth: 0, 920 proxyScroll: null, 921 scrollPos: 1, 922 stickyClassname: 'sticky-header', 923 resizeClassname: 'resize', // stops all transitions on resize 924 isListening: false, 925 t: 0, 926 927 init: function () { 928 this.proxyScroll = $.proxy(this.onscroll, this); 929 this.$window.on('resize orientationchange', $.proxy(this.resize, this)); 930 this.lastWidth = this.$window.width(); 931 this.resize(); 932 }, 933 934 resize: function (e) { 935 var w = this._getInnerWidth(); 936 if (w >= this.desktopWidth) { 937 this.listen(); 938 } 939 else { 940 this.cancel(); 941 } 942 943 if (this.lastWidth !== w) { 944 // add class to remove transition effects during resize 945 if (!this.$body.hasClass(this.resizeClassname)) { 946 this.$body.addClass(this.resizeClassname); 947 } 948 // on complete removes resize class 949 clearTimeout(this.t); 950 this.t = setTimeout($.proxy(this.resizeComplete, this), 500); 951 } 952 this.lastWidth = w; 953 }, 954 955 listen: function () { 956 if (!this.isListening) { 957 this.isListening = true; 958 this.$window.on('scroll', this.proxyScroll); 959 } 960 }, 961 962 cancel: function (e) { 963 if (this.isListening) { 964 this.isListening = false; 965 this.$window.off('scroll', this.scrollProxy); 966 } 967 }, 968 969 onscroll: function (e) { 970 if (this.$window.scrollTop() > this.scrollPos) { 971 if (!this.$body.hasClass(this.stickyClassname)) { 972 this.$body.addClass(this.stickyClassname); 973 } 974 } 975 else { 976 if (this.$body.hasClass(this.stickyClassname)) { 977 this.$body.removeClass(this.stickyClassname); 978 } 979 } 980 }, 981 982 resizeComplete: function () { 983 clearTimeout(this.t); 984 if (this.$body.hasClass(this.resizeClassname)) { 985 this.$body.removeClass(this.resizeClassname); 986 } 987 }, 988 989 990 _getInnerWidth: function () { 991 return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 992 }, 993 994 995 996 }; 997 998 var tableElems = { 999 1000 elms: $('.main table'), 1001 1002 tableFunction: function () { 1003 tableElems.elms.each(function () { 1004 var $this = $(this), 1005 parent = $this.parent(); 1006 if (!parent.hasClass('table')) { 1007 $this.wrap('<div class="table"/>'); 1008 } 1009 }); 1010 }, 1011 1012 eventListeners: function () { 1013 if (tableElems.elms.length > 0) { 1014 tableElems.tableFunction(); 1015 } 1016 }, 1017 init: function () { 1018 tableElems.eventListeners(); 1019 } 1020 }; 1021 // The .each() method is unnecessary here: 1022 1023 1024 // $( '.twitter-panel' ).each(function() { 1025 // var twtHandle = $(this).data('handle'), 1026 // $this = $(this); 1027 1028 // //$this.find('h2').text(twtHandle.substring(1)); // remove first char (replaced in css) 1029 1030 // $this.socialfeed({ 1031 // // TWITTER 1032 // twitter:{ 1033 // accounts: [ twtHandle ], 1034 // //accounts: queryTags, //Array: Specify a list of accounts from which to pull tweets 1035 // limit: 1, //Integer: max number of tweets to load 1036 // consumer_key: 'Q4zFXZwmO2uD1Ru4aCilYwTnB', //String: consumer key. make sure to have your app read-only 1037 // consumer_secret: 'iTzc234DGCNprwXkDkS0xQcc9nGkABTClQGOZ4er9Y7WkaMHur',//String: consumer secret key. make sure to have your app read-only 1038 // }, 1039 1040 // // GENERAL SETTINGS 1041 // length:400, //Integer: For posts with text longer than this length, show an ellipsis. 1042 // show_media:false, //Boolean: if false, doesn't display any post images
1043 // media_min_width: 300, //Integer: Only get posts with images larger than this value 1044 // //update_period: 5000, //Integer: Number of seconds before social-feed will attempt to load new posts. 1045 // template: 'tweet.html', //String: Filename used to get the post template. 1046 // template_html: //String: HTML used for each post. This overrides the 'template' filename option 1047 1048 // '<p class="date-time">Post {{=it.time_ago}}</p> \ 1049 // <div class="text-wrapper"> \ 1050 // <a href="{{=it.link}}" target="_blank"> \ 1051 // <p class="social-feed-text">{{=it.text}}</p> \ 1052 // </a> \ 1053 // </div>', 1054 1055 // //date_format: "LLL", //String: Display format of the date attribute (see http://momentjs.com/docs/#/displaying/format/) 1056 // moderation: function(content) { //Function: if returns false, template will have class hidden 1057 // return (content.text) ? content.text.indexOf('fuck') == -1 : true; 1058 // }, 1059 // callback: function() { //Function: This is a callback function which is evoked when all the posts are collected and displayed 1060 // console.log('All posts collected!'); 1061 // } 1062 // }); 1063 // }); 1064 1065 // *********************** 1066 // $$ Document ready 1067 // *********************** 1068 (function ($) { 1069 $(function () { 1070 window.windowWidth = window.innerWidth; 1071 window.windowHeight = window.innerHeight; 1072 1073 window.isiPhone = navigator.userAgent.toLowerCase().indexOf('iphone'); 1074 window.isiPad = navigator.userAgent.toLowerCase().indexOf('ipad'); 1075 window.isiPod = navigator.userAgent.toLowerCase().indexOf('ipod'); 1076 window.isFirefox = (navigator.userAgent.toLowerCase().indexOf('firefox') > -1); 1077 1078 window.tablet = 768; 1079 window.tabletWide = 1024; 1080 window.desktop = 1280; 1081 1082 1083 1084 // Add functions here 1085 1086 headerScroll.init(); 1087 footerPos.init(); 1088 navOverlay.init(); 1089 mobileNav.init(); 1090 1091 accordion.init(); 1092 1093 socialFeed.init(); 1094 1095 burgerElems.init(); 1096 contentNav.init(); 1097 historyTimeline.init(); 1098 1099 // stickyHeader.init(); 1100 // stickyFooter.init(); 1101 mediaGallery.init(); 1102 tableElems.init(); 1103 contactOptions.init(); 1104 btt.init(); 1105 1106 $(function () { 1107 $('.fit-video').fitVids(); 1108 }); 1109 $(function () { 1110 $('.panel .image img').lazy({ 1111 effect: "fadeIn", 1112 effectTime: 300, 1113 threshold: 75 1114 }); 1115 $('.panel .copy').matchHeight(); 1116 }); 1117 if ($(window).width() <= 1280) { 1118 $('.nav-wrapper').addClass('in-mobile'); 1119 $('.nav-wrapper').removeClass('in-large'); 1120 } else { 1121 $('.nav-wrapper').removeClass('in-mobile'); 1122 $('.nav-wrapper').addClass('in-large'); 1123 } 1124 $(function () { 1125 $(document).on('click touch', '.gallery-filter .trigger', function () { 1126 $(this).toggleClass('active'); 1127 $(this).next().toggleClass('active'); 1128 }); 1129 }); 1130 $(function () { 1131 $(document).on('click touch', '.asx-header .button', function () { 1132 $(this).toggleClass('active'); 1133 //$(this).next().toggleClass('active'); 1134 }) 1135 }); 1136 $(function () { 1137 $(document).on('click touch', '.tnc', function () { 1138 var $chk = $(this).find('input[type=checkbox]'); 1139 $chk.prop('checked', $chk.is(':checked') ? false : true); 1140 }) 1141 }); 1142 }); 1143 1144 //TODO TIDY THIS INTO PARTIAL 1145 var stickyHeaders = (function () { 1146 1147 var $stickies, 1148 $offset; 1149 1150 var load = function (stickies, target, offset) { 1151 1152 $offset = offset || 0; 1153 1154 if (typeof stickies === "object" && stickies instanceof jQuery && stickies.length > 0) { 1155 1156 $stickies = stickies.each(function () { 1157 1158 var $thisSticky = $(this); 1159 1160 $thisSticky 1161 .data('originalPosition', $thisSticky.offset().top) 1162 .data('originalHeight', $thisSticky.outerHeight()); 1163 });
1164 1165 target.off("scroll.stickies").on("scroll.stickies", function (event) { 1166 _whenScrolling(event); 1167 }); 1168 } 1169 }; 1170 1171 var _whenScrolling = function (event) { 1172 1173 var $scrollTop = $(event.currentTarget).scrollTop() + $offset; 1174 1175 $stickies.each(function (i) { 1176 1177 var $thisSticky = $(this), 1178 $stickyPosition = $thisSticky.data('originalPosition'), 1179 $newPosition, 1180 $nextSticky; 1181 1182 if ($stickyPosition <= $scrollTop) { 1183 1184 $newPosition = Math.max(0, $scrollTop - $stickyPosition); 1185 $nextSticky = $stickies.eq(i + 1); 1186 1187 if ($nextSticky.length > 0) { 1188 1189 $newPosition = Math.min($newPosition, ($nextSticky.data('originalPosition') - $stickyPosition) - $thisSticky.data('originalHeight')); 1190 } 1191 1192 } else { 1193 1194 $newPosition = 0; 1195 } 1196 1197 $thisSticky.css('transform', 'translateY(' + $newPosition + 'px)'); 1198 1199 //could just as easily use top instead of transform 1200 //$thisSticky.css('top', $newPosition + 'px'); 1201 }); 1202 }; 1203 1204 return { 1205 load: load 1206 }; 1207 })(); 1208 1209 $(window).on('load', function () { 1210 if ($(window).width() >= 1025) { 1211 stickyHeaders.load($(".ylabel"), $(window), 100); 1212 } 1213 if ($(window).width() >= 770) { 1214 $('.wrapper.no-image').each(function () { 1215 var $prevItemHeight = $(this).parent().prev('.day').height(); 1216 $(this).height($prevItemHeight); 1217 }); 1218 } 1219 }); 1220 1221 $(document).foundation(); 1222 })(jQuery); 1223 1224 1225 // *********************** 1226 // $$ Smart resize 1227 // *********************** 1228 (function ($, sr) { 1229 var debounce = function (func, threshold, execAsap) { 1230 var timeout; 1231 return function debounced() { 1232 var obj = this, 1233 args = arguments; 1234 function delayed() { 1235 if (!execAsap) { 1236 func.apply(obj, args); 1237 } 1238 timeout = null; 1239 } 1240 if (timeout) { 1241 clearTimeout(timeout); 1242 } else if (execAsap) { 1243 func.apply(obj, args); 1244 } 1245 timeout = setTimeout(delayed, threshold || 200); 1246 }; 1247 }; 1248 jQuery.fn[sr] = function (fn) { 1249 return fn ? this.bind('resize', debounce(fn)) : this.trigger(sr); 1250 }; 1251 })(jQuery, 'smartresize'); // End smartresize 1252 1253 var resizeTimer; 1254 $(window).smartresize(function () { 1255 window.newWindowWidth = window.innerWidth; 1256 window.newWindowHeight = window.innerHeight; 1257 1258 var newWindowWidthResult = newWindowWidth * 0.66, 1259 $navWrapper = $('.nav-wrapper'); 1260 1261 window.windowWidth = window.innerWidth; 1262 window.windowHeight = window.innerHeight; 1263 if ($(window).width() < 1024) { // changed to 1280 1264 footerPos.init(); 1265 } 1266 if ($(window).width() <= 1280) { // changed to 1280 1267 $navWrapper.addClass('in-mobile'); 1268 $navWrapper.removeClass('in-large'); 1269 } else { 1270 $navWrapper.removeClass('in-mobile'); 1271 $navWrapper.addClass('in-large'); 1272 if ($navWrapper.hasClass('mbl-active')) { 1273 $navWrapper.removeClass('mbl-active'); 1274 $('.burger-button').removeClass('is-active'); 1275 $('#main').removeClass('overlay'); 1276 } 1277 } 1278 if ($(window).width() >= 760) { // changed to 1280 1279 $('.wrapper.no-image').each(function () { 1280 var $prevItemHeight = $(this).parent().prev('.day').height(); 1281 $(this).height($prevItemHeight); 1282 }); 1283 } 1284 if ($('.mg-grid').length > 0) { 1285 $('.mg-grid li').removeAttr('style'); 1286 } 1287 1288 // JIRA: WESF-20 1289 // Only apply the resize fix if not in Sitefinity editor 1290 if ($('.sfPageEditor').length == 0) { 1291 $('body').addClass('resize'); 1292 clearTimeout(resizeTimer); 1293 resizeTimer = setTimeout(function () { 1294 $('body').removeClass('resize'); 1295 // Run code here, resizing has "stopped" 1296 }, 250); 1297 } 1298 }); 1299});// jQuery end 1300// no writing in this file 1301 1302//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBvbHlmaWxscy5qcyIsImpxdWVyeS1zdGFydC5qcyIsImNvbXBvbmVudHMvYzA3X2FjY29yZGlvbi5qcyIsImNvbXBvbmVudHMvY29udGFjdE9wdGlvbnMuanMiLCJnbG9iYWwvYnR0LmpzIiwiZ2xvYmFsL2J1cmdlcnRpbWUuanMiLCJnbG9iYWwvY29udGVudC1uYXYuanMiLCJnbG9iYWwvZm9vdGVyLmpzIiwiZ2xvYmFsL2hlYWRlclNjcm9sbC5qcyIsImdsb2JhbC9oaXN0b3J5LmpzIiwiZ2xvYmFsL2xvY2F0aW9ucy5qcyIsImdsb2JhbC9tYXRjaEhlaWdodC5qcyIsImdsb2JhbC9tb2JpbGUtbmF2LmpzIiwiZ2xvYmFsL25hdi1vdmVybGF5LmpzIiwiZ2xvYmFsL3NvY2lhbC1mZWVkLmpzIiwiZ2xvYmFsL3N0aWNreS1mb290ZXIuanMiLCJnbG9iYWwvc3RpY2t5LWhlYWRlci5qcyIsImdsb2JhbC90YWJsZXMuanMiLCJnbG9iYWwvdHdpdHRlci1wYW5lbC5qcyIsImRvYy1yZWFkeS5qcyIsInJlc2l6ZS1ldmVud
1302HMuanMiLCJqcXVlcnktZW5kLmpzIiwiYXBwLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQy9KQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDMUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDaEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN6RUE7QUFDQTtBQ0RBIiwiZmlsZSI6ImFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbImlmICghd2luZG93LmxvY2F0aW9uLm9yaWdpbikge1xyXG4gICAgd2luZG93LmxvY2F0aW9uLm9yaWdpbiA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiArIH
1302dpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSArICh3aW5kb3cubG9jYXRpb24ucG9ydCA/ICc6JyArIHdpbmRvdy5sb2NhdGlvbi5wb3J0OiAnJyk7XHJcbn0iLCIvLyBkZWZpbmUgalF1ZXJ5XHJcbmpRdWVyeShmdW5jdGlvbigkKXtcclxuJ3VzZSBzdHJpY3QnOyIsInZhciBhY2NvcmRpb24gPSB7XHJcblxyXG5cdGluaXQ6IGZ1bmN0aW9uKCkgeyBcclxuXHQgICAvLyBhY2NvcmRpb25cclxuICAgICAgIC8vJCgnLmFjY29yZGlvbiB1bCBsaSBoMycpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgIFx0JCgnLmFjY29yZGlvbiBidXR0b24nKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHtcclxuICAgICAgIFx0XHRcclxuICAgICAgICAgICAgJCh0aGlzKS50b2dnbGVDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgICAgICAgICQodGhpcykubmV4dCgpLnNsaWRlVG9nZ2xlKCc0MDAnKTtcclxuICAgICAgICB9KTtcclxuXHR9XHJcbn07IiwidmFyIGNvbnRhY3RPcHRpb25zID0ge1xyXG5cclxuXHRlbGVtQ29udGFjdDogJy5kZGxDb250YWN0JywgXHJcblx0ZWxlbURpdmlzaW9uOiAnLmRkbERpdmlzaW9uJywgXHJcblx0YWxsQ29udGFjdHM6IG51bGwsIFxyXG5cclxuXHRyZXNldDogZnVuY3Rpb24oKSB7IFxyXG5cclxuXHRcdHZhciBibGFuayA9ICQodGhpcy5lbGVtQ29udGFjdCArICcgb3B0aW9uJykuZmlyc3QoKTtcclxuXHRcdCQodGhpcy5lbGVtQ29udGFjdCArICcgb3B0aW9uJykucmVtb3ZlKCk7IFxyXG5cdFx0YmxhbmsuYXBwZW5kVG8odGhpcy5lbGVtQ29udGFjdCk7IFxyXG5cdH0sIFxyXG5cclxuXHRiaW5kOiBmdW5jdGlvbigpIHtcclxuXHJcblx0XHQkKHRoaXMuZWxlbURpdmlzaW9uKS5vbignY2hhbmdlJywgZnVuY3Rpb24oKSB7ICBcclxuXHRcdFx0Y29udGFjdE9wdGlvbnMucmVzZXQoKTtcclxuXHRcdFx0dmFyIHNlbCA9ICQodGhpcykuZmluZCgnOnNlbGVjdGVkJykudmFsKCk7IFxyXG5cdFx0XHQvL1RPRE86IHN0cmVhbWxpbmUgdGhpcyBmdW5jdGlvblxyXG5cdFx0XHR2YXIgb3B0cyA9IGNvbnRhY3RPcHRpb25zLmFsbENvbnRhY3RzLmZpbHRlcihmdW5jdGlvbihpbmRleCkgeyBcclxuXHRcdFx0XHRyZXR1cm4gKGluZGV4ID09PSAwIHx8ICQodGhpcykuYXR0cignY2xhc3MnKSA9PT0gc2VsKTtcclxuXHRcdFx0fSk7IFxyXG5cdFx0XHQkLmVhY2gob3B0cywgZnVuY3Rpb24oaSxqKSB7IFxyXG5cdFx0XHRcdCQoaikuYXBwZW5kVG8oY29udGFjdE9wdGlvbnMuZWxlbUNvbnRhY3QpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0Ly8kKGNvbnRhY3RPcHRpb25zLmVsZW1Db250YWN0ICsgJyBvcHRpb24nKS5maXJzdCgpLmF0dHIoXCJzZWxlY3RlZFwiLCBcInNlbGVjdGVkXCIpO1xyXG5cdFx0fSk7XHJcblx0fSwgXHJcblxyXG5cdGluaXQ6IGZ1bmN0aW9uKCkgeyAgXHJcblx0XHR0aGlzLmFsbENvbnRhY3RzID0gJCh0aGlzLmVsZW1Db250YWN0ICsgJyBvcHRpb24nKTsgXHJcblx0XHR0aGlzLnJlc2V0KCk7XHJcblx0XHR0aGlzLmJpbmQoKTtcclxuXHR9IFxyXG59OyIsInZhciBidHQgPSB7XHJcblxyXG5cdGJpbmQ6IGZ1bmN0aW9uKCkgeyBcclxuXHRcdFxyXG5cdFx0JChkb2N1bWVudCkub24oJ2NsaWNrIHRvdWNoJywnI2J0dCcsIGZ1bmN0aW9uIChlKSB7IFxyXG5cdFx0XHRlLnByZXZlbnREZWZhdWx0O1xyXG5cdFx0XHQkKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7c2Nyb2xsVG9wOiAwfSwgNzAwKTsgXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuICAgICAgXHR9KTtcclxuXHR9LFxyXG5cclxuXHRldmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7ICBcclxuXHJcblx0XHQkKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uKCkgeyBcclxuXHJcblx0ICAgIFx0JCgnI2J0dCcpLmNzcygnYm90dG9tJywgTWF0aC5tYXgoMzAsICQoJ2Zvb3RlcicpLm91dGVySGVpZ2h0KCkgLSAoJChkb2N1bWVudCkuaGVpZ2h0KCkgLSAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgLSAkKHdpbmRvdykuaGVpZ2h0KCkpKSk7IFxyXG5cclxuXHQgICAgXHRpZiAoJCh3aW5kb3cpLnNjcm9sbFRvcCgpID4gMjAwKSBcclxuXHQgICAgXHR7IFxyXG5cdCAgICBcdFx0JCgnI2J0dCcpLmZhZGVJbigzMDApO1xyXG5cdCAgICBcdH0gXHJcblx0ICAgIFx0ZWxzZSBcclxuXHQgICAgXHR7XHJcblx0ICAgIFx0XHQkKCcjYnR0JykuZmFkZU91dCgzMDApO1xyXG5cdCAgICBcdH1cclxuXHJcblx0ICAgIH0pO1xyXG5cclxuXHR9LCBcclxuXHJcblx0aW5pdDogZnVuY3Rpb24oKSB7ICBcclxuXHJcblx0XHQkKCcjYnR0JykuZmFkZU91dCgzMDApO1xyXG5cdFx0YnR0LmJpbmQoKTtcclxuXHRcdGJ0dC5ldmVudExpc3RlbmVycygpOyBcclxuXHR9XHJcbn07ICIsInZhciBidXJnZXJFbGVtcyA9IHtcclxuXHJcblx0ZWxtczoge1xyXG5cdFx0YnVyZ2VyQnV0dG9uOiAkKCcjYnVyZ2VyLWJ1dHRvbicpXHJcblx0fSxcclxuXHJcblx0YnVyZ2VyRnVuY3Rpb246IGZ1bmN0aW9uKCkge1xyXG5cdFx0YnVyZ2VyRWxlbXMuZWxtcy5idXJnZXJCdXR0b24ub24oJ2NsaWNrJywgZnVuY3Rpb24oIGUgKSB7XHJcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0JCh0aGlzKS50b2dnbGVDbGFzcygnaXMtYWN0aXZlJyk7XHJcblx0XHRcdCQoJyNtYWluJykudG9nZ2xlQ2xhc3MoJ292ZXJsYXknKTtcclxuXHRcdFx0JCgnLm5hdi13cmFwcGVyJykudG9nZ2xlQ2xhc3MoJ21ibC1hY3RpdmUnKTtcclxuXHRcdFx0aWYgKCQodGhpcykuaGFzQ2xhc3MoJ2lzLWFjdGl2ZScpKSB7XHJcblx0XHRcdFx0JCgnLmdsb2JhbC1zdWInKS5yZW1vdmVDbGFzcygnaXMtYWN0aXZlJyk7XHJcblx0XHRcdFx0JCgnLmdsb2JhbC1zdWItbmF2LmlzLWFjdGl2ZScpLnNsaWRlVG9nZ2xlKCc0MDAnKS5yZW1vdmVDbGFzcygnaXMtYWN0aXZlJyk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH0sXHJcblxyXG5cdGV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHtcclxuXHRcdGlmICgkKCcjYnVyZ2VyLWJ1dHRvbicpLmxlbmd0aCA+IDApIHtcclxuXHQgICAgICAgIGJ1cmdlckVsZW1zLmJ1cmdlckZ1bmN0aW9uKCk7XHJcblx0ICAgIH1cclxuXHR9LFxyXG5cdGluaXQ6IGZ1bmN0aW9uKCkgeyBcclxuXHRcdGJ1cmdlckVsZW1zLmV2ZW50TGlzdGVuZXJzKCk7XHJcblx0fVxyXG59OyIsInZhciBjb250ZW50TmF2ID0ge1xyXG5cclxuXHQkd2luZG93OiAkKHdpbmRvdyksXHJcblxyXG5cdGRlc2t0b3BXaWR0aCA6IDEyODAsXHJcblxyXG5cdG1vYmlsZSA6IHtcclxuXHJcblx0XHQkdG9nZ2xlOiAkKCcuY29udGVudC1uYXYubW9iaWxlLW5hdiAubWJsLWNvbnRlbnQtbmF2JyksXHJcblx0XHRwcm94eVRvZ2dsZSA6IG51bGwsXHJcblx0XHRpc0xpc3RlbmluZzpmYWxzZSxcclxuXHJcblx0XHRpbml0IDogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHR0aGlzLnByb3h5VG9nZ2xlID0gJC5wcm94eSh0aGlzLnRvZ2dsZUhhbmRsZXIsIHR
1302oaXMpO1x0XHRcdFxyXG5cdFx0fSxcclxuXHJcblx0XHRsaXN0ZW4gOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdGlmICghdGhpcy5pc0xpc3RlbmluZykge1xyXG5cdFx0XHRcdHRoaXMuaXNMaXN0ZW5pbmcgPSB0cnVlO1x0XHJcblx0XHRcdFx0dGhpcy4kdG9nZ2xlLm9uKCdjbGljayB0b3VjaCcsIHRoaXMucHJveHlUb2dnbGUpO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cclxuXHRcdGNhbmNlbCA6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0aWYgKHRoaXMuaXNMaXN0ZW5pbmcpIHtcclxuXHRcdFx0XHR0aGlzLmlzTGlzdGVuaW5nID0gZmFsc2U7XHRcdFxyXG5cdFx0XHRcdHRoaXMuJHRvZ2dsZS5vZmYoJ2NsaWNrIHRvdWNoJywgdGhpcy5wcm94eVRvZ2dsZSk7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblxyXG5cdFx0dG9nZ2xlSGFuZGxlciA6IGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0JChlLnRhcmdldCkudG9nZ2xlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cclxuXHRkZXNrdG9wIDoge1xyXG5cdFx0JHRvZ2dsZTogJCgnLmNvbnRlbnQtbmF2LmRlc2t0b3AtbmF2IC5kcm9wZG93bicpLFxyXG5cclxuXHRcdHByb3h5VG9nZ2xlIDogbnVsbCxcclxuXHRcdGlzTGlzdGVuaW5nOmZhbHNlLFxyXG5cclxuXHRcdGluaXQgOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHRoaXMucHJveHlUb2dnbGUgPSAkLnByb3h5KHRoaXMudG9nZ2xlSGFuZGxlciwgdGhpcyk7XHJcblx0XHR9LFxyXG5cclxuXHRcdGxpc3RlbiA6IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdGlmICghdGhpcy5pc0xpc3RlbmluZykge1xyXG5cdFx0XHRcdHRoaXMuaXNMaXN0ZW5pbmcgPSB0cnVlO1x0XHRcclxuXHRcdFx0XHR0aGlzLiR0b2dnbGUub24oJ2NsaWNrIHRvdWNoJywgdGhpcy5wcm94eVRvZ2dsZSk7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblxyXG5cdFx0Y2FuY2VsIDogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRpZiAodGhpcy5pc0xpc3RlbmluZykge1xyXG5cdFx0XHRcdHRoaXMuaXNMaXN0ZW5pbmcgPSBmYWxzZTtcdFx0XHJcblx0XHRcdFx0dGhpcy4kdG9nZ2xlLm9mZignY2xpY2sgdG91Y2gnLCB0aGlzLnByb3h5VG9nZ2xlKTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHJcblx0XHR0b2dnbGVIYW5kbGVyIDogZnVuY3Rpb24gKGUpIHtcclxuXHJcblx0XHRcdFxyXG5cdFx0XHR2YXIgJGVsID0gJChlLnRhcmdldCksXHJcblx0XHRcdFx0JGRyb3AgPSAkKGUudGFyZ2V0KS5jbG9zZXN0KCcuZHJvcGRvd24nKSxcclxuXHRcdFx0XHRpc0FjdGl2ZSA9ICRkcm9wLmhhc0NsYXNzKCdpcy1hY3RpdmUnKTtcclxuXHRcdFx0XHRcclxuXHRcdFx0aWYgKCEkZWwuaXMoJ2EnKSl7XHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcclxuXHRcdFx0XHR0aGlzLiR0b2dnbGUucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xyXG5cclxuXHRcdFx0XHRpZiAoIWlzQWN0aXZlKSB7XHJcblx0XHRcdFx0XHQkZHJvcC5hZGRDbGFzcygnaXMtYWN0aXZlJyk7IFxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHJcblx0fSxcclxuXHJcblxyXG5cdGluaXQgOiBmdW5jdGlvbiAoKSB7XHJcblx0XHR0aGlzLmRlc2t0b3AuaW5pdCgpO1xyXG5cdFx0dGhpcy5tb2JpbGUuaW5pdCgpO1xyXG5cclxuXHRcdHRoaXMuJHdpbmRvdy5vbigncmVzaXplIG9yaWVudGF0aW9uY2hhbmdlJywgJC5wcm94eSh0aGlzLnJlc2l6ZSwgdGhpcykpO1xyXG5cdFx0dGhpcy5yZXNpemUoKTsgXHJcblx0fSxcclxuXHJcblxyXG5cdHJlc2l6ZSA6IGZ1bmN0aW9uICgpIHtcclxuXHRcdGlmICh0aGlzLl9nZXRJbm5lcldpZHRoKCkgPj0gdGhpcy5kZXNrdG9wV2lkdGggKSB7XHJcblx0XHRcdHRoaXMuZGVza3RvcC5saXN0ZW4oKTtcclxuXHRcdFx0dGhpcy5tb2JpbGUuY2FuY2VsKCk7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0dGhpcy5tb2JpbGUubGlzdGVuKCk7XHJcblx0XHRcdHRoaXMuZGVza3RvcC5jYW5jZWwoKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuICAgIF9nZXRJbm5lcldpZHRoIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggfHwgZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDsgXHJcbiAgICB9XHJcblx0XHJcbn07XHJcblxyXG5cclxuIiwiLyogZ2xvYmFscyBGb3VuZGF0aW9uOiBmYWxzZSAqL1xyXG52YXIgZm9vdGVyUG9zID0ge1xyXG5cclxuXHRlbG1zOiB7XHJcblx0XHRmb290ZXI6ICQoJ2Zvb3RlcicpLFxyXG5cdFx0Ym9keTogJCgnYm9keScpXHJcblx0fSxcclxuXHJcblx0Zm9vdGVyRnVuY3Rpb246IGZ1bmN0aW9uKCkge1xyXG5cclxuXHR9LFxyXG5cclxuXHRldmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgZm9vdGVySGVpZ2h0ID0gZm9vdGVyUG9zLmVsbXMuZm9vdGVyLmhlaWdodCgpICsgODA7XHJcblx0XHR2YXIgYm9keUhlaWdodCA9IGZvb3RlclBvcy5lbG1zLmJvZHkuaGVpZ2h0KCk7XHJcblx0XHR2YXIgd2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xyXG5cdFx0XHJcblx0XHRpZiAoRm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmF0TGVhc3QoJ21lZGl1bScpKSB7XHJcblx0XHRcdCQoJyNtYWluJykuY3NzKCdwYWRkaW5nLWJvdHRvbScsIGZvb3RlckhlaWdodCk7XHJcblx0XHRcdGlmIChib2R5SGVpZ2h0IDwgd2luZG93SGVpZ2h0KSB7XHJcblx0XHRcdFx0JCgnYm9keScpLmFkZENsYXNzKCdmdHItZml4Jyk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9LFxyXG5cdGluaXQ6IGZ1bmN0aW9uKCkgeyBcclxuXHRcdGZvb3RlclBvcy5ldmVudExpc3RlbmVycygpO1xyXG5cdH1cclxufTsiLCJ2YXIgaGVhZGVyU2Nyb2xsID0ge1xyXG5cclxuXHRlbG1zOiB7XHJcblxyXG5cdH0sXHJcblxyXG5cdGhlYWRlckZ1bmN0aW9uOiBmdW5jdGlvbigpIHtcclxuXHJcblx0fSxcclxuXHJcblx0ZXZlbnRMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkge1xyXG5cdCAgICAvL2NhY2hlcyBhIGpRdWVyeSBvYmplY3QgY29udGFpbmluZyB0aGUgaGVhZGVyIGVsZW1lbnRcclxuXHQgICAgdmFyIGJvZHkgPSAkKCdib2R5Jyk7XHJcblx0ICAgIHZhciBoZWFkZXIgPSAkKCdoZWFkZXInKTtcclxuXHQgICAgdmFyIGhlYWRlckhlaWdodCA9IGhlYWRlci5oZWlnaHQoKTtcclxuXHQgICAgJCh3aW5kb3cpLnNjcm9sbChmdW5jdGlvbigpIHtcclxuXHQgICAgICAgI
1302HZhciBzY3JvbGwgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7XHJcblxyXG5cdCAgICAgICAgaWYgKHNjcm9sbCA+PSAxMDApIHtcclxuXHQgICAgICAgICAgICBib2R5LmFkZENsYXNzKCdzdGlja3ktaGVhZGVyJyk7XHJcblx0ICAgICAgICB9IGVsc2Uge1xyXG5cdCAgICAgICAgICAgIGJvZHkucmVtb3ZlQ2xhc3MoJ3N0aWNreS1oZWFkZXInKTtcclxuXHQgICAgICAgIH1cclxuXHQgICAgfSk7XHJcblx0fSxcclxuXHRpbml0OiBmdW5jdGlvbigpIHsgXHJcblx0XHRoZWFkZXJTY3JvbGwuZXZlbnRMaXN0ZW5lcnMoKTtcclxuXHR9XHJcbn07IiwiLyogZ2xvYmFscyBkb1Q6IGZhbHNlICovXHJcbnZhciBoaXN0b3J5VGltZWxpbmUgPSB7XHJcblxyXG5cdHJlbmRlclRlbXBsYXRlOiBudWxsLFxyXG5cdHRlbXBsYXRlOiAne3t+IGl0IDppfX08ZGl2IGNsYXNzPVwieWVhclwiPjxkaXYgY2xhc3M9XCJtaWRsaW5lXCI+PC9kaXY+PHNwYW4gY2xhc3M9XCJ5bGFiZWxcIj57ez1pLnllYXJ9fTwvc3Bhbj57e34gaS5pdGVtcyA6aX19PGEgaHJlZj1cInt7PWkuVXJsfX1cIiBjbGFzcz1cImRheSB7ez1pLnBvc2l0aW9uT3ZlcnJpZGV9fVwiPjxkaXYgY2xhc3M9XCJ3cmFwcGVyIHt7PyAhaS5JbWFnZSB9fW5vLWltYWdle3s/fX1cIj57ez8gaS5JbWFnZSB9fTxkaXYgY2xhc3M9XCJpbWFnZSB7ez1pLkNsYXNzfX1cIj48aW1nIHNyYz1cInt7PWkuSW1hZ2V9fVwiIC8+PC9kaXY+e3s/fX08ZGl2IGNsYXNzPVwiY29weVwiPjxzcGFuIGNsYXNzPVwidGFnXCI+e3s9aS5DYXRlZ29yeX19PC9zcGFuPjxoMj57ez1pLlRpdGxlfX08L2gyPjxzcGFuIGNsYXNzPVwiZGF0ZVwiPnt7PWkuTW9tZW50LmZvcm1hdChcIk1NTSBZWVlZXCIpfX08L3NwYW4+PC9kaXY+PC9kaXY+PC9hPnt7fn19PC9kaXY+e3t+fX0nLFxyXG5cclxuICBcdHJlbmRlckRhdGE6IGZ1bmN0aW9uKHRpbWVsaW5lLCBkYXRhLCBxdWVyeUNhdGVnb3J5KSB7XHJcbiAgXHRcdGlmIChxdWVyeUNhdGVnb3J5KSB7XHJcblx0XHRcdHZhciByZXQgPSBbXTtcclxuXHRcdFx0JChkYXRhKS5lYWNoKGZ1bmN0aW9uKGksZCkge1xyXG5cdFx0XHRcdGlmIChkLkNhdGVnb3J5ID09PSBxdWVyeUNhdGVnb3J5KSB7XHJcblx0XHRcdFx0XHRyZXQucHVzaChkKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0XHRkYXRhID0gcmV0O1xyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGdyb3VwcyA9IHt9O1x0XHRcclxuXHRcdCQuZWFjaChkYXRhLCBmdW5jdGlvbihpLCBpdGVtKSB7XHJcblx0XHQgICAgaXRlbS5Nb21lbnQgPSBtb21lbnQoaXRlbS5EYXRlLCAnREQvTU0vWVlZWScsIHRydWUpO1xyXG5cdFx0ICAgIHZhciB5ZWFyID0gaXRlbS5Nb21lbnQueWVhcigpO1xyXG5cdFx0ICAgIC8vY29uc29sZS5sb2coeWVhcik7XHJcblx0XHQgICAgaWYoZ3JvdXBzW3llYXJdKSB7XHJcblx0XHQgICAgICAgIGdyb3Vwc1t5ZWFyXS5wdXNoKGl0ZW0pO1xyXG5cdFx0ICAgIH0gZWxzZSB7XHJcblx0XHQgICAgICAgIGdyb3Vwc1t5ZWFyXSA9IFtpdGVtXTtcclxuXHRcdCAgICB9XHJcblx0XHR9KTtcclxuXHJcblx0XHR2YXIgZGF0YUJ5WWVhciA9ICQubWFwKGdyb3VwcywgZnVuY3Rpb24oaXRlbXNGb3JZZWFyLCB5ZWFyKSB7XHJcblx0XHQgICAgcmV0dXJuIHtcclxuXHRcdCAgICBcdHllYXI6IHllYXIsXHJcblx0XHQgICAgXHRpdGVtczogaXRlbXNGb3JZZWFyXHJcblx0XHQgICAgfTtcclxuXHRcdH0pO1xyXG5cdFx0dmFyIGxheW91dENsYXNzID0gJ2NlbnRlci1sZWZ0JztcclxuXHRcdCQuZWFjaChncm91cHMsIGZ1bmN0aW9uKGssIHYpIHtcclxuXHRcdFx0aWYgKCQodGhpcykubGVuZ3RoIDwgMikge1xyXG5cdFx0XHRcdHZhciByZXRDbGFzcyA9IHNldENsYXNzKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dlswXS5wb3NpdGlvbk92ZXJyaWRlID0gcmV0Q2xhc3M7XHJcblx0XHR9KTtcclxuXHRcdFxyXG5cdFx0ZnVuY3Rpb24gc2V0Q2xhc3MoKSB7XHRcdFx0XHJcblx0XHRcdFxyXG5cdFx0XHRpZiAobGF5b3V0Q2xhc3MgPT09ICdjZW50ZXItbGVmdCcpIHtcclxuXHRcdFx0XHRsYXlvdXRDbGFzcyA9ICdjZW50ZXItcmlnaHQnOyBcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRsYXlvdXRDbGFzcyA9ICdjZW50ZXItbGVmdCc7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGxheW91dENsYXNzO1xyXG5cdFx0XHRcclxuXHRcdH1cclxuXHRcdGRhdGFCeVllYXIuc29ydChmdW5jdGlvbihhLGIpIHtcclxuXHRcdFx0aWYgKGEueWVhciA+IGIueWVhcikge1xyXG5cdFx0XHRcdHJldHVybiAtMTtcclxuXHRcdFx0fSBlbHNlIGlmIChhLnllYXIgPCBiLnllYXIpIHtcclxuXHRcdFx0XHRyZXR1cm4gMTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRyZXR1cm4gMDtcclxuXHRcdFx0fVxyXG5cdFx0XHQgICAgXHJcblx0XHR9KTtcclxuXHRcdC8vYXBwZW5kIHRoZSBodG1sXHJcblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5yZW5kZXJUZW1wbGF0ZShkYXRhQnlZZWFyKTtcclxuXHRcdCQoJy50aW1lbGluZScsIHRpbWVsaW5lKS5hcHBlbmQocmVzdWx0KTtcclxuXHRcdC8vZW5zdXJlIGFsbCB0aGUgaGVpZ2h0cyBvZiB0aGUgcG9kcyBtYXRjaFxyXG5cdFx0dGltZWxpbmUuaW1hZ2VzTG9hZGVkKCkuYWx3YXlzKCBmdW5jdGlvbiggaW5zdGFuY2UgKSB7XHRcdFx0XHJcblx0XHRcdHRpbWVsaW5lLmZpbmQoXCIueWVhciAuZGF5IC53cmFwcGVyXCIpLm1hdGNoSGVpZ2h0KCk7XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcclxuXHRcdH0pO1xyXG5cclxuXHJcblx0fSxcclxuXHRidWlsZEZpbHRlcjogZnVuY3Rpb24odGltZWxpbmUsIGRhdGEpIHtcclxuXHRcdHZhciBjYXRlZ29yaWVzID0gW107XHJcblxyXG5cdFx0JC5lYWNoKGRhdGEsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkge1xyXG5cdFx0ICAgIGlmICgkLmluQXJyYXkodmFsdWUuQ2F0ZWdvcnksIGNhdGVnb3JpZXMpPT0tMSkge1xyXG5cdFx0ICAgICAgICAvL3ZhciBpbnNlcnQgPSAnPGEgaHJlZj1cIiNcIj4nICsgdmFsdWUuQ2F0ZWdvcnkgKyAnPC9hPic7XHJcblx0XHQgICAgICAgIGNhdGVnb3JpZXMucHVzaCh2YWx1ZS
13025DYXRlZ29yeSk7XHJcblx0XHQgICAgfVxyXG5cdFx0fSk7XHJcblx0ICAgIHZhciBjTGlzdCA9ICQoJy50aW1lbGluZS1maWx0ZXInKTtcclxuXHQgICAgJC5lYWNoKGNhdGVnb3JpZXMsIGZ1bmN0aW9uKGkpIHtcclxuXHRcdFx0dmFyIGZpbHRlckJ0biA9ICQoJzxhLz4nKS50ZXh0KGNhdGVnb3JpZXNbaV0pLmF0dHIoJ2RhdGEtbmFtZScsIGNhdGVnb3JpZXNbaV0pLmF0dHIoJ2NsYXNzJywgJ2ZpbHRlci1idG4nKS5hdHRyKCdocmVmJywgJz9jYXQ9JyArIGNhdGVnb3JpZXNbaV0pLmFwcGVuZFRvKGNMaXN0KTtcclxuXHRcdFx0dmFyIGZpbHRlck9wdGlvbnMgPSAkKCc8b3B0aW9uPicpLnRleHQoY2F0ZWdvcmllc1tpXSkuYXR0cignZGF0YS1wYXRoJywgJz9jYXQ9JyArY2F0ZWdvcmllc1tpXSkuYXBwZW5kVG8oJy5tYmwtZmlsdGVyJyk7XHJcblx0XHR9KTtcclxuXHRcdCQoJy5maWx0ZXItYnRuJykuZWFjaChmdW5jdGlvbigpe1xyXG5cdFx0XHR2YXIgcGFnZVF1ZXJ5ID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSkuc3BsaXQoJz0nKTtcclxuXHRcdFx0dmFyIHF1ZXJ5Q2F0ZWdvcnkgPSBwYWdlUXVlcnlbMV07XHJcblx0XHRcdGlmICgkKHRoaXMpLmRhdGEoJ25hbWUnKSA9PSBxdWVyeUNhdGVnb3J5KSB7XHJcblx0XHRcdFx0JCgnLmZpbHRlci1idG4nKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XHJcblx0XHRcdFx0JCh0aGlzKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH0sXHJcblx0ZGlzYWJsZTogZnVuY3Rpb24odGltZWxpbmUpXHJcblx0e1xyXG5cdFx0Ly8kKCcubG9hZC1tb3JlJywgdGltZWxpbmUpLmhpZGUoKTtcclxuXHR9LFxyXG5cdGZpbHRlckNhdGVnb3J5OiBmdW5jdGlvbihjYXRhZ29yeU5hbWUpIHtcclxuXHJcblx0fSxcclxuXHJcblx0aW5pdDogZnVuY3Rpb24oKSB7XHJcblx0XHR0aGlzLmluaXRUZW1wbGF0ZXMoKTtcclxuXHRcdHRoaXMuaW5pdEV2ZW50cygpO1xyXG5cdH0sXHJcblxyXG5cdGluaXRUZW1wbGF0ZXM6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dGhpcy5yZW5kZXJUZW1wbGF0ZSA9IGRvVC50ZW1wbGF0ZSh0aGlzLnRlbXBsYXRlKTtcclxuXHR9LFxyXG5cclxuXHRpbml0RXZlbnRzOiBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBwYWdlUXVlcnkgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKS5zcGxpdCgnPScpO1xyXG5cclxuXHRcdHZhciBxdWVyeUNhdGVnb3J5ID0gcGFnZVF1ZXJ5WzFdO1xyXG5cdFx0Ly8gaWYoZG9jdW1lbnQubG9jYXRpb24uc2VhcmNoLmxlbmd0aCkge1xyXG5cdFx0Ly8gXHRpZiAocXVlcnlDYXRlZ29yeSAhPT0gJycpIHtcclxuXHRcdC8vIFx0XHQkKCcudGltZWxpbmUnKS5yZW1vdmVDbGFzcygnc2hvdy1hbGwnKTtcclxuXHRcdC8vIFx0fVxyXG5cdFx0Ly8gfSBlbHNlIHtcclxuXHRcdC8vICAgICAvLyBubyBxdWVyeSBzdHJpbmcgZXhpc3RzXHJcblx0XHQvLyB9XHJcblxyXG5cclxuXHRcdCQoJ1tkYXRhLWhpc3RvcnldJykuZWFjaChmdW5jdGlvbihpLCB0aW1lbGluZSkge1xyXG5cclxuXHRcdFx0dmFyIHRpbWVsaW5lID0gJCh0aW1lbGluZSk7XHJcblxyXG5cdFx0XHR2YXIgbG9hZFVybCA9IHRpbWVsaW5lLmRhdGEoJ3VybCcpO1xyXG5cdFx0XHQkLmFqYXgoe1xyXG5cdFx0XHRcdHVybDogbG9hZFVybCxcclxuXHRcdFx0XHR0eXBlOiAnR0VUJyxcclxuXHRcdFx0XHRkYXRhVHlwZTogJ2pzb24nLFxyXG5cdFx0XHRcdHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XHJcblx0XHRcdFx0XHRoaXN0b3J5VGltZWxpbmUucmVuZGVyRGF0YSh0aW1lbGluZSwgZGF0YSwgcXVlcnlDYXRlZ29yeSk7XHJcblx0XHRcdFx0XHRoaXN0b3J5VGltZWxpbmUuYnVpbGRGaWx0ZXIodGltZWxpbmUsIGRhdGEpO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0ZXJyb3I6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKCdDb3VsZCBub3QgbG9hZCBjb250ZW50LicpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHRcdC8vaGFkIHRvIGFkZCBqcyBmdW5jdGlvbiBmb3IgYW5jaG9yIG9uY2xpY2sgLSBmaXhlcyBhIGJ1ZyBpbiBzbWFsbCBzY3JlZW5cclxuXHRcdCQoZG9jdW1lbnQpLm9uKCdjbGljaycsICdhLmZpbHRlci1idG4nICwgZnVuY3Rpb24oZSkge1xyXG5cdFx0XHR3aW5kb3cubG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgJCh0aGlzKS5hdHRyKCdocmVmJyk7XHJcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdH0pO1xyXG5cdCAgICAvL01vYmlsZSBkcm9wIGRvd24gdmVyc2lvblxyXG5cdCAgICAkKCcubWJsLWZpbHRlcicpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHtcclxuXHQgICAgICAgIHZhciBkYXRhSUQgPSAkKHRoaXMpLmZpbmQoJzpzZWxlY3RlZCcpLnZhbCgpO1xyXG5cdCAgICAgICAgd2luZG93LmxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArICQodGhpcykuZmluZCgnOnNlbGVjdGVkJykuYXR0cignZGF0YS1wYXRoJyk7XHJcblx0ICAgIH0pO1xyXG5cdH1cclxufTtcclxuIiwidmFyIGdtYXAgPSB7ICBcclxuXHJcblx0aW5pdDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIC8vIGhhbmRsZXMgZ29vZ2xlIG1hcHNcclxuICAgICAgaWYgKCQoJy5nLW1hcCcpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB2Y
1302XIgcGluU21hbGwgPSAnL2Fzc2V0cy9pbWcvaWNvbnMvaWNvbi1waW4ucG5nJztcclxuICAgICAgICAkKCcuZy1tYXAnKS5lYWNoKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICB2YXIgbXlDZW50ZXI9bmV3IGdvb2dsZS5tYXBzLkxhdExuZygkKHRoaXMpLmRhdGEoJ2xhdCcpLCAkKHRoaXMpLmRhdGEoJ2xvbicpKTtcclxuICAgICAgICAgIHZhciBsb2NhdGlvbkVsZW1lbnQgPSAkKHRoaXMpWzBdO1xyXG4gICAgICAgICAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHtcclxuICAgICAgICAgICAgdmFyIG1hcFByb3AgPSB7XHJcbiAgICAgICAgICAgICAgY2VudGVyOm15Q2VudGVyLFxyXG4gICAgICAgICAgICAgIHpvb206MTcsXHJcbiAgICAgICAgICAgICAgbWFwVHlwZUlkOmdvb2dsZS5tYXBzLk1hcFR5cGVJZC5ST0FETUFQXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKGxvY2F0aW9uRWxlbWVudCxtYXBQcm9wKTtcclxuICAgICAgICAgICAgdmFyIG1hcmtlciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoe1xyXG4gICAgICAgICAgICAgIGljb246IHBpblNtYWxsLFxyXG4gICAgICAgICAgICAgIHBvc2l0aW9uOm15Q2VudGVyXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBtYXJrZXIuc2V0TWFwKG1hcCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBnb29nbGUubWFwcy5ldmVudC5hZGREb21MaXN0ZW5lcih3aW5kb3csICdsb2FkJywgaW5pdGlhbGl6ZSk7XHJcbiAgICAgICAgfSk7IFxyXG4gICAgICB9IFxyXG5cdH1cclxuXHJcbn07IiwidmFyIG1hdGNoSGVpZ2h0RWxtcyA9IHtcclxuXHJcblx0ZWxtczoge1xyXG5cdFx0cHJvbW9Cb3g6ICQoJy5wcm9tbycpXHJcblx0fSxcclxuXHJcblx0bWF0Y2hIZWlnaHRGdW5jdGlvbjogZnVuY3Rpb24oKSB7XHJcblx0XHQkKCcucHJvbW8nKS5tYXRjaEhlaWdodCgpO1xyXG5cdH0sXHJcblxyXG5cdGV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHtcclxuXHRcdGlmICgkKCcucHJvbW8nKS5sZW5ndGggPiAwKSB7XHJcblx0ICAgICAgICBtYXRjaEhlaWdodEVsbXMubWF0Y2hIZWlnaHRGdW5jdGlvbigpO1xyXG5cdCAgICB9XHJcblx0fSxcclxuXHJcblx0aW5pdDogZnVuY3Rpb24oKSB7IFxyXG5cdFx0bWF0Y2hIZWlnaHRFbG1zLmV2ZW50TGlzdGVuZXJzKCk7XHJcblx0XHQvLyBmaWx0ZXJzIG1pbiBoZWlnaHRcclxuXHRcdGlmICgkKCcuZmlsdGVyLXdyYXBwZXInKS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdHZhciBncm91cE1pbkhlaWdodCA9ICQoJy5ncm91cC1zZWxlY3QnKS5oZWlnaHQoKTtcclxuXHRcdFx0JCgnLmdyb3VwJykuY3NzKCdtaW4taGVpZ2h0JywgZ3JvdXBNaW5IZWlnaHQpO1xyXG5cdFx0fVxyXG5cdH1cclxufTsiLCJ2YXIgbW9iaWxlTmF2ID0ge1xyXG5cdCR3aW5kb3c6ICQod2luZG93KSxcclxuXHQkbWFpbiA6ICQoJyNtYWluJyksXHJcblx0JGNvbHVtbnMgOiQoJ25hdiAuZ2xvYmFsLXN1YiAuY29sdW1ucycpLFxyXG5cclxuXHQkYnVyZ2VyQnRuIDogJCgnI2J1cmdlci1idXR0b24nKSxcclxuXHQkbWJsQmFjazogJCgnbmF2IC5tYmwtYmFjaycpLFxyXG5cdCRnbG9iYWxTdWIgOiAkKCduYXYgLmdsb2JhbC1zdWInKSxcclxuXHQkbmF2V3JhcHBlciA6ICQoJy5uYXYtd3JhcHBlcicpLFxyXG5cclxuXHQkYnRucyA6ICQoJ25hdiAuZ2xvYmFsID4gbGkgPiBhLCAudXRpbCA+IGxpID4gYScpLFx0XHJcblx0JGJ0bnNFeHBhbmQgOiAkKCduYXYgLmdsb2JhbC1zdWIgLnN1Yi10aXRsZScpLFxyXG5cdCRidG5zU3ViRXhwYW5kIDogJCgnbmF2IC5nbG9iYWwtc3ViLW5hdiAuc3ViLW5hdiBhJyksXHJcblx0JHN1YkV4cGFuZDogJCgnbmF2IC5nbG9iYWwtc3ViLW5hdiAuc3ViLW5hdicgKSxcclxuXHQkc2VhcmNoRmllbGQ6ICQoJ25hdiAuZ2xvYmFsLXNlYXJjaCAjZ2JsLXNyY2gsIG5hdiAuZ2xvYmFsLXNlYXJjaCAjZ2JsLXNyY2gtc2JtdCcpLFxyXG5cclxuXHRkZXNrdG9wV2lkdGggOiAxMjgwLFxyXG5cdHByb3h5Q2xpY2sgOiBudWxsLFxyXG5cdHByb3h5VG9nZ2xlRXhwYW5kIDogbnVsbCxcclxuXHRwcm94eUNsb3NlIDogbnVsbCxcclxuXHRwcm94eUJhY2sgOiBudWxsLFxyXG5cdHByb3h5U3ViVG9nZ2xlRXhwYW5kOm51bGwsXHJcblx0cHJveHlGb2N1cyA6IG51bGwsXHJcblxyXG5cdGFjdGl2ZUNsYXNzOidpcy1hY3RpdmUnLFxyXG5cclxuXHRpc0xpc3RlbmluZzpmYWxzZSxcclxuXHRcclxuXHRpbml0OiBmdW5jdGlvbigpIHsgXHJcblx0XHR0aGlzLnByb3h5VG9nZ2xlRXhwYW5kID0gJC5wcm94eSh0aGlzLnRvZ2dsZUV4cGFuZCwgdGhpcyk7XHJcblx0XHR0aGlzLnByb3h5Q2xpY2sgPSAkLnByb3h5KHRoaXMuY2xpY2ssIHRoaXMpO1xyXG5cdFx0dGhpcy5wcm94eUNsb3NlID0gJC5wcm94eSh0aGlzLmNsb3NlLCB0aGlzKTtcclxuXHRcdHRoaXMucHJveHlCYWNrID0gJC5wcm94eSh0aGlzLmJhY2ssIHRoaXMpO1xyXG5cdFx0dGhpcy5wcm94eVN1YlRvZ2dsZUV4cGFuZCA9ICQucHJveHkodGhpcy5zdWJUb2dnbGVFeHBhbmQsIHRoaXMpO1xyXG5cdFx0dGhpcy5wcm94eUZvY3VzID0gJC5wcm94eSh0aGlzLmZvY3VzLCB0aGlzKTtcclxuXHJcblx0XHR0aGlzLiR3aW5kb3cub24oJ3Jlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZScsICQucHJveHkodGhpcy5yZXNpemUsIHRoaXMpKTtcclxuXHRcdFxyXG5cdFx0dGhpcy5yZXNpemUoKTsgXHJcblx0fSxcclxuXHJcblxyXG5cdGZvY3VzIDogZnVuY3Rpb24gKGUpIHtcclxuXHRcdC8vIHN0b3AgdGFiIGZvY3VzIG91dHNpZGUgb2YgbmF2aWdhdGlvbiBiZWluZyBvcGVuXHJcblx0XHRpZiAoZS5rZXlDb2RlID09PSA5ICYmICF0aGlzLiRuYXZXcmFwcGVyLmhhc0NsYXNzKCdtYmwtYWN0aXZlJykpICB7XHJcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRyZXNpemUgOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRpZiAodGhpcy5fZ2V0SW5uZXJXaWR0aCgpIDwgdGhpcy5kZXNrdG9wV2lkdGggKSB7XHJcblx0XHRcdHRoaXMubGlzdGVuKCk7XHJcblx0XHR9XHJcblx0XHRlbHNlIFxyXG5cdFx0e1xyXG5cdFx0XHR0aGlzLmNhbmNlbCgpO1xyXG5cdFx0XHR0aGlzLmNsb3NlKCk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0bGlzdGVuIDogZnVuY3Rpb24gKCkge1x0XHJcblx0XHRpZiAoIXRoaXMuaXNMaXN0ZW5pbmcpIHtcdFx0XHRcclxuXHRcdFx0dGhpcy5pc0xpc3RlbmluZyA9IHRydWU7XHJcblx0XHRcdHRoaXMuJGJ0bnMub24oJ2NsaWNrIHRvdWNoJywgdGhpcy5wcm94eUNsaWNrKTtcclxuXHRcdFx0dGhpcy4kYn
1302Ruc0V4cGFuZC5vbignY2xpY2sgdG91Y2gnLCB0aGlzLnByb3h5VG9nZ2xlRXhwYW5kKTtcdFx0XHRcclxuXHRcdFx0dGhpcy4kbWJsQmFjay5vbignY2xpY2sgdG91Y2gnLCB0aGlzLnByb3h5QmFjayk7XHJcblx0XHRcdHRoaXMuJG1haW4ub24oJ2NsaWNrIHRvdWNoJywgdGhpcy5wcm94eUNsb3NlKTtcclxuXHRcdFx0dGhpcy4kYnRuc1N1YkV4cGFuZC5vbignY2xpY2sgdG91Y2gnLCB0aGlzLnByb3h5U3ViVG9nZ2xlRXhwYW5kKTtcclxuXHRcdFx0dGhpcy4kd2luZG93Lm9uKCdrZXlkb3duJywgdGhpcy5wcm94eUZvY3VzKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRjYW5jZWwgOiBmdW5jdGlvbiAoKSB7IFxyXG5cdFx0aWYgKHRoaXMuaXNMaXN0ZW5pbmcpIHtcclxuXHRcdFx0dGhpcy5pc0xpc3RlbmluZyA9IGZhbHNlO1x0XHJcblx0XHRcdHRoaXMuJGJ0bnMub2ZmKCdjbGljayB0b3VjaCcsIHRoaXMucHJveHlDbGljayk7XHJcblx0XHRcdHRoaXMuJGJ0bnNFeHBhbmQub2ZmKCdjbGljayB0b3VjaCcsIHRoaXMucHJveHlUb2dnbGVFeHBhbmQpO1x0XHRcdFxyXG5cdFx0XHR0aGlzLiRtYmxCYWNrLm9mZignY2xpY2sgdG91Y2gnLCB0aGlzLnByb3h5QmFjayk7XHJcblx0XHRcdHRoaXMuJG1haW4ub2ZmKCdjbGljayB0b3VjaCcsIHRoaXMucHJveHlDbG9zZSk7XHJcblx0XHRcdHRoaXMuJGJ0bnNTdWJFeHBhbmQub2ZmKCdjbGljayB0b3VjaCcsIHRoaXMucHJveHlTdWJUb2dnbGVFeHBhbmQpO1xyXG5cdFx0XHQvL3RoaXMuJHNlYXJjaEZpZWxkLm9mZignZm9jdXMnLCB0aGlzLnByb3h5Rm9jdXMpO1xyXG5cdFx0XHR0aGlzLiR3aW5kb3cub2ZmKCdrZXlkb3duJywgdGhpcy5wcm94eUZvY3VzKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRiYWNrIDogZnVuY3Rpb24gKGUpIHtcclxuXHRcdGUucHJldmVudERlZmF1bHQoKTtcdFxyXG5cdFx0dGhpcy4kZ2xvYmFsU3ViLnJlbW92ZUNsYXNzKHRoaXMuYWN0aXZlQ2xhc3MpO1xyXG5cdFx0dGhpcy4kY29sdW1ucy5yZW1vdmVDbGFzcyh0aGlzLmFjdGl2ZUNsYXNzKTtcclxuXHR9LFxyXG5cclxuXHRjbG9zZSA6IGZ1bmN0aW9uIChlKSB7IFxyXG5cdFx0aWYgKGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLiRuYXZXcmFwcGVyLmhhc0NsYXNzKCdtYmwtYWN0aXZlJykpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9XHJcbiAgICBcdHRoaXMuJGJ1cmdlckJ0bi5yZW1vdmVDbGFzcyh0aGlzLmFjdGl2ZUNsYXNzKTtcclxuICAgIFx0dGhpcy4kbmF2V3JhcHBlci5yZW1vdmVDbGFzcygnbWJsLWFjdGl2ZScpO1xyXG5cdCAgICB0aGlzLiRtYWluLnJlbW92ZUNsYXNzKCdvdmVybGF5Jyk7XHJcblx0ICAgIHRoaXMuJGNvbHVtbnMucmVtb3ZlQ2xhc3ModGhpcy5hY3RpdmVDbGFzcyk7XHJcblx0XHR0aGlzLiRzdWJFeHBhbmQucmVtb3ZlQ2xhc3ModGhpcy5hY3RpdmVDbGFzcyk7XHJcblx0fSxcclxuXHJcblx0Y2xpY2sgOiBmdW5jdGlvbiAoZSkge1x0XHJcblx0XHRcdFxyXG5cdFx0dmFyICR0YXJnZXQgPSAkKGUudGFyZ2V0KSwgXHJcblx0XHQkcGFyZW50ID0gJHRhcmdldC5jbG9zZXN0KCdsaScpLFxyXG5cdFx0JGVsID0gJHRhcmdldC5uZXh0KCcuZ2xvYmFsLXN1YicpO1xyXG5cdFx0aWYgKCEkZWwuaGFzQ2xhc3ModGhpcy5hY3RpdmVDbGFzcykgKSB7XHJcblx0XHRcdCRlbC5hZGRDbGFzcyh0aGlzLmFjdGl2ZUNsYXNzKTtcclxuXHRcdH1cdFx0XHRcdFxyXG5cdFx0aWYgKCEkcGFyZW50Lmhhc0NsYXNzKCdleGMnKSl7XHJcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHRvZ2dsZUV4cGFuZCA6IGZ1bmN0aW9uIChlKSB7XHRcclxuXHRcdGUucHJldmVudERlZmF1bHQoKTtcdFx0XHJcblx0XHR2YXIgJHRhcmdldCA9ICQoZS50YXJnZXQpLFx0XHRcdFxyXG5cdFx0XHQkcGFyZW50ID0gJHRhcmdldC5jbG9zZXN0KCcuY29sdW1ucycpLFxyXG5cdFx0XHRpc0FjdGl2ZSA9ICRwYXJlbnQuaGFzQ2xhc3ModGhpcy5hY3RpdmVDbGFzcyk7XHJcblx0XHQvLyBjbG9zZSBhbnkgYWN0aXZlIHN1YiBtZW51c1xyXG5cdFx0dGhpcy4kY29sdW1ucy5yZW1vdmVDbGFzcyh0aGlzLmFjdGl2ZUNsYXNzKTtcclxuXHRcdC8vIG9wZW4gXHJcblx0XHRpZiAoIWlzQWN0aXZlKSB7XHJcblx0XHRcdCRwYXJlbnQuYWRkQ2xhc3ModGhpcy5hY3RpdmVDbGFzcyk7XHRcdFx0XHRcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRzdWJUb2dnbGVFeHBhbmQgOiBmdW5jdGlvbiAoZSkge1xyXG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1x0XHRcclxuXHRcdHZhciAkdGFyZ2V0ID0gJChlLnRhcmdldCksXHJcblx0XHRcdCRwYXJlbnQgPSAkdGFyZ2V0LmNsb3Nlc3QoJy5zdWItbmF2JyksXHJcblx0XHRcdGlzQWN0aXZlID0gJHBhcmVudC5oYXNDbGFzcyh0aGlzLmFjdGl2ZUNsYXNzKTtcclxuXHRcdC8vIGNsb3NlIGFueSBhY3RpdmUgc3ViIG1lbnVzXHJcblx0XHR0aGlzLiRzdWJFeHBhbmQucmVtb3ZlQ2xhc3ModGhpcy5hY3RpdmVDbGFzcyk7XHJcblx0XHQvLyBvcGVuIFxyXG5cdFx0aWYgKCFpc0FjdGl2ZSkge1xyXG5cdFx0XHQkcGFyZW50LmFkZENsYXNzKHRoaXMuYWN0aXZlQ2xhc3MpO1x0XHRcdFx0XHJcblx0XHR9XHJcblxyXG5cdH0sXHJcblxyXG4gICAgX2dldElubmVyV2lkdGggOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCB8fCBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoOyBcclxuICAgIH1cclxufTsiLCJ2YXIgbmF2T3ZlcmxheSA9IHtcclxuXHJcblx0JHdpbmRvdzogJCh3aW5kb3cpLFxyXG5cdCRib2R5IDogJCgnYm9keScpLFxyXG5cdCRtYWluIDogJCgnI21haW4nKSxcclxuXHRkZXNrdG9wV2lkdGggOiAxMjgwLFxyXG5cdGNsYXNzZXMgOiAnLmluLWxhcmdlIC5nbG9iYWwgPiBsaTpub3QoLmV4YyksIC5pbi1sYXJnZSAudXRpbCA+IGxpOm5vdCguZXhjKScsXHJcblx0JGVsIDogJCgnLmluLWxhcmdlIC5nbG9iYWwgPiBsaTpub3QoLmV4YyksIC5pbi1sYXJnZSAudXRpbCA+IGxpOm5vdCguZXhjKScpLFxyXG5cdG92ZXJsYXlDbGFzc25hbWU6J292ZXJsYXknLFxyXG5cdHByb3h5VG9nZ2xlIDogbnVsbCxcdFxyXG5cdHJlc2l6ZVByb3h5Om51bGwsXHJcblx0aXNMaXN0ZW5pbmc6ZmFsc2UsXHJcblx0XHJcblx0aW5pdDogZnVuY3Rpb24oKSB7IFxyXG5cdFx0dGhpcy5wcm94eVRvZ2dsZSA9ICQucHJveHkodGhpcy50b2dnbGVPdmVybGF5LCB0aGlzKTtcclxuXHRcdHRoaXMucmVzaXplUHJveHkgPSAkLnByb3h5KHRoaXMucmVzaXplLCB0aGlzKTtcclxuXHRcdHRoaXMuJHdpbmRvdy5vbigncmVzaXplIG9yaWVudGF0aW9uY2hhbmdlJywgdGhpcy5yZXNpemVQcm94eSk
13027XHJcblxyXG5cdFx0dGhpcy5yZXNpemUoKTsgXHJcblx0fSxcclxuXHJcblx0cmVzaXplIDogZnVuY3Rpb24gKCkge1xyXG5cdFx0aWYgKHRoaXMuX2dldElubmVyV2lkdGgoKSA+PSB0aGlzLmRlc2t0b3BXaWR0aCApIHtcclxuXHRcdFx0dGhpcy5saXN0ZW4oKTtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHR0aGlzLmNhbmNlbCgpO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdGxpc3RlbiA6IGZ1bmN0aW9uICgpIHtcclxuXHRcdGlmICghdGhpcy5pc0xpc3RlbmluZykge1xyXG5cdFx0XHR0aGlzLmlzTGlzdGVuaW5nID0gdHJ1ZTtcdFx0XHJcblx0XHRcdHRoaXMuJGVsLm9uKCdtb3VzZW92ZXInLCB0aGlzLnByb3h5VG9nZ2xlICk7XHJcblx0XHRcdHRoaXMuJGVsLm9uKCdtb3VzZWxlYXZlJywgdGhpcy5wcm94eVRvZ2dsZSApO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdGNhbmNlbCA6IGZ1bmN0aW9uICgpIHtcclxuXHRcdGlmICh0aGlzLmlzTGlzdGVuaW5nKSB7XHJcblx0XHRcdHRoaXMuaXNMaXN0ZW5pbmcgPSBmYWxzZTtcdFxyXG5cdFx0XHR0aGlzLiRlbC5vZmYoJ21vdXNlb3ZlcicsIHRoaXMucHJveHlUb2dnbGUgKTtcclxuXHRcdFx0dGhpcy4kZWwub2ZmKCdtb3VzZWxlYXZlJywgdGhpcy5wcm94eVRvZ2dsZSApO1xyXG5cdFx0XHR0aGlzLiRtYWluLnJlbW92ZUNsYXNzKHRoaXMub3ZlcmxheUNsYXNzbmFtZSk7XHRcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHR0b2dnbGVPdmVybGF5IDogZnVuY3Rpb24gKGUpIHtcclxuXHRcdGlmIChlLnR5cGUgPT0gJ21vdXNlb3ZlcicpIHtcclxuXHRcdFx0dGhpcy4kbWFpbi5hZGRDbGFzcyh0aGlzLm92ZXJsYXlDbGFzc25hbWUpO1x0XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0dGhpcy4kbWFpbi5yZW1vdmVDbGFzcyh0aGlzLm92ZXJsYXlDbGFzc25hbWUpO1x0XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblxyXG4gICAgX2dldElubmVyV2lkdGggOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCB8fCBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoOyBcclxuICAgIH0sXHJcblxyXG59OyIsInZhciBzb2NpYWxGZWVkID0geyAgXHJcblxyXG5cdGluaXQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICQoJy5zb2NpYWwtZmVlZC1jb250YWluZXInKS5zb2NpYWxmZWVkKHtcclxuICAgICAgICAgICAgLy8gRkFDRUJPT0tcclxuICAgICAgICAgICAgLy8gZmFjZWJvb2s6e1xyXG4gICAgICAgICAgICAvLyAgICAgYWNjb3VudHM6IFsnQGphbWVzLmJ1cm5hZ2UuMSddLCAgLy9BcnJheTogU3BlY2lmeSBhIGxpc3Qgb2YgYWNjb3VudHMgZnJvbSB3aGljaCB0byBwdWxsIHdhbGwgcG9zdHNcclxuICAgICAgICAgICAgLy8gICAgIGxpbWl0OiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnRlZ2VyOiBtYXggbnVtYmVyIG9mIHBvc3RzIHRvIGxvYWRcclxuICAgICAgICAgICAgLy8gICAgIGFjY2Vzc190b2tlbjogJzE1MTQyNzg3ODU3NjY0NnwzYjlhZGRmZjY4ZDMxYWRiY2U4ZGNlMDAxNTEyYTAyNCcgIC8vU3RyaW5nOiBcIkFQUF9JRHxBUFBfU0VDUkVUXCJcclxuICAgICAgICAgICAgLy8gfSxcclxuXHJcbiAgICAgICAgICAgIC8vIFRXSVRURVJcclxuICAgICAgICAgICAgdHdpdHRlcjp7XHJcbiAgICAgICAgICAgICAgICBhY2NvdW50czogWydAV2VzZmFybWVyc0FydHMnLCAnQFdlc2Zhcm1lcnMnXSwgICAgICAgICAgICAgICAgICAgICAgLy9BcnJheTogU3BlY2lmeSBhIGxpc3Qgb2YgYWNjb3VudHMgZnJvbSB3aGljaCB0byBwdWxsIHR3ZWV0c1xyXG4gICAgICAgICAgICAgICAgbGltaXQ6IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ludGVnZXI6IG1heCBudW1iZXIgb2YgdHdlZXRzIHRvIGxvYWRcclxuICAgICAgICAgICAgICAgIGNvbnN1bWVyX2tleTogJ1E0ekZYWndtTzJ1RDFSdTRhQ2lsWXdUbkInLCAgICAgICAgICAvL1N0cmluZzogY29uc3VtZXIga2V5LiBtYWtlIHN1cmUgdG8gaGF2ZSB5b3VyIGFwcCByZWFkLW9ubHlcclxuICAgICAgICAgICAgICAgIGNvbnN1bWVyX3NlY3JldDogJ2lUemMyMzRER0NOcHJ3WGtEa1MweFFjYzluR2tBQlRDbFFHT1o0ZXI5WTdXa2FNSHVyJywvL1N0cmluZzogY29uc3VtZXIgc2VjcmV0IGtleS4gbWFrZSBzdXJlIHRvIGhhdmUgeW91ciBhcHAgcmVhZC1vbmx5XHJcbiAgICAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgICAgLy8gVktcclxuICAgICAgICAgICAgLy8gdms6e1xyXG4gICAgICAgICAgICAvLyAgICAgYWNjb3VudHM6IFsnQDEyNTkzNjUyMycsJyN0ZXNsYW1vdG9ycyddLCAgICAvL0FycmF5OiBTcGVjaWZ5IGEgbGlzdCBvZiBhY2NvdW50cyBmcm9tIHdoaWNoIHRvIHB1bGwgcG9zdHNcclxuICAgICAgICAgICAgLy8gICAgIGxpbWl0OiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnRlZ2VyOiBtYXggbnVtYmVyIG9mIHBvc3RzIHRvIGxvYWRcclxuICAgICAgICAgICAgLy8gICAgIHNvdXJjZTogJ2FsbCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TdHJpbmc6IFZLIEFQSSBwb3N0IGZpbHRlci4gUG9zc2libGUgdmFsdWVzOiBcIk93bmVyXCIsXCJPdGhlcnNcIixcImFsbFwiLFwic3VnZ2VzdHNcIlxyXG4gICAgICAgICAgICAvLyB9LFxyXG5cclxuICAgICAgICAgICAgLy8gR09PR0xFUExVU1xyXG4gICAgICAgICAgICAvLyBnb29nbGU6e1xyXG4gICAgICAgICAgICAvLyAgICAgIGFjY291bnRzOiBbJyN0ZXNsYW1vdG9ycyddLCAgICAgICAgICAgICAgICAvL0FycmF5OiBTcGVjaWZ5IGEgbGlzdCBvZiBhY2NvdW50cyBmcm9tIHdoaWNoIHRvIHB1bGwgcG9zdHNcclxuICAgICAgICAgICAgLy8gICAgICBsaW1pdDogMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnRlZ2VyOiBtYXggbnVtYmVyIG9mIHBvc3RzIHRvIGxvYWRcclxuICAgICAgICAgICAgLy8gICAgICBhY2Nlc3NfdG9rZW46ICdZT1VSX0dPT0dMRV9QTFVTX0FDQ0VTU19UT0tFTicvL1N0cmluZzogRysgYWNjZXNzIHRva2VuXHJcbiAgICAgICAgICAgIC8vICB9LFxyXG5cclxuICAgICAgICAgICAgLy8gSU5TVEFHUkFNXHJcbiAgICAgICAgICAgIGluc3RhZ3JhbTp7XHJcbiAgICAgICAgICAgICAgICBhY2NvdW50czogWydAd2VzZmFybWVyc2FydHMnXSwgIC8vQXJyYXk6IFNwZWNpZnkgYSBsaXN0IG9mIGFjY291bnRzIGZyb20gd2h
1302pY2ggdG8gcHVsbCBwb3N0c1xyXG4gICAgICAgICAgICAgICAgbGltaXQ6IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ludGVnZXI6IG1heCBudW1iZXIgb2YgcG9zdHMgdG8gbG9hZFxyXG4gICAgICAgICAgICAgICAgY2xpZW50X2lkOiAnYTc0MTQ2Yzc4OGZiNDcyOWE1OTYxZGZhNjNlZDk2MjgnLCAgICAgICAvL1N0cmluZzogSW5zdGFncmFtIGNsaWVudCBpZCAob3B0aW9uIGlmIHVzaW5nIGFjY2VzcyB0b2tlbilcclxuICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbjogJzI5ODA5MDMwOTcuMTY3N2VkMC42NGYzZWE0OTI0MzM0YThhYTNiMjA4YzdhNTA3YzM2NicgLy9TdHJpbmc6IEluc3RhZ3JhbSBhY2Nlc3MgdG9rZW5cclxuICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgIC8vIFBJTlRFUkVTVFxyXG5cclxuICAgICAgICAgICAgcGludGVyZXN0OntcclxuICAgICAgICAgICAgICAgIGFjY291bnRzOiBbJ0BtZSddLCAgIC8vQXJyYXk6IFNwZWNpZnkgYSBsaXN0IG9mIGFjY291bnRzIGZyb20gd2hpY2ggdG8gcHVsbCBwb3N0c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0BtZSB0byBwdWxsIHlvdXIgcGluc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0B1c2VyL2JvYXJkIHRvIHB1bGwgcGlucyBmcm9tIGEgdXNlciBib2FyZFxyXG4gICAgICAgICAgICAgICAgbGltaXQ6IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ludGVnZXI6IG1heCBudW1iZXIgb2YgcG9zdHMgdG8gbG9hZFxyXG4gICAgICAgICAgICAgICAgYWNjZXNzX3Rva2VuOiAnQVZRTVladTBsU3ZpUEVTVzM2NnhlUnYyaXAzeEZEWXFERTRtcUNwQzVKVTZNdUF2NXdBQUFBQScgLy9TdHJpbmc6IFBpbnRlcmVzdCBjbGllbnQgaWRcclxuICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgIC8vUlNTXHJcbiAgICAgICAgICAgIHJzczp7XHJcbiAgICAgICAgICAgICAgICB1cmxzOiBbJ2h0dHBzOi8vd3d3LnNtYXNoaW5nbWFnYXppbmUuY29tL2ZlZWQvJ10sIC8vQXJyYXk6IFNwZWNpZml5IGEgbGlzdCBvZiByc3MgZmVlZCBmcm9tIHdoaWNoIHRvIHB1bGwgcG9zdHNcclxuICAgICAgICAgICAgICAgIGxpbWl0OiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ludGVnZXI6IG1heCBudW1iZXIgb2YgcG9zdHMgdG8gbG9hZCBmb3IgZWFjaCB1cmxcclxuICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgIC8vIEdFTkVSQUwgU0VUVElOR1NcclxuICAgICAgICAgICAgbGVuZ3RoOjQwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnRlZ2VyOiBGb3IgcG9zdHMgd2l0aCB0ZXh0IGxvbmdlciB0aGFuIHRoaXMgbGVuZ3RoLCBzaG93IGFuIGVsbGlwc2lzLlxyXG4gICAgICAgICAgICBzaG93X21lZGlhOnRydWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0Jvb2xlYW46IGlmIGZhbHNlLCBkb2Vzbid0IGRpc3BsYXkgYW55IHBvc3QgaW1hZ2VzXHJcbiAgICAgICAgICAgIG1lZGlhX21pbl93aWR0aDogMzAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW50ZWdlcjogT25seSBnZXQgcG9zdHMgd2l0aCBpbWFnZXMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZVxyXG4gICAgICAgICAgICAvL3VwZGF0ZV9wZXJpb2Q6IDUwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW50ZWdlcjogTnVtYmVyIG9mIHNlY29uZHMgYmVmb3JlIHNvY2lhbC1mZWVkIHdpbGwgYXR0ZW1wdCB0byBsb2FkIG5ldyBwb3N0cy5cclxuICAgICAgICAgICAgdGVtcGxhdGU6IFwidHdlZXQuaHRtbFwiLCAgICAgICAgICAgICAgICAgICAgICAgICAvL1N0cmluZzogRmlsZW5hbWUgdXNlZCB0byBnZXQgdGhlIHBvc3QgdGVtcGxhdGUuXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2h0bWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3RyaW5nOiBIVE1MIHVzZWQgZm9yIGVhY2ggcG9zdC4gVGhpcyBvdmVycmlkZXMgdGhlICd0ZW1wbGF0ZScgZmlsZW5hbWUgb3B0aW9uXHJcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic29jaWFsLWZlZWQtZWxlbWVudCB7ez8gIWl0Lm1vZGVyYXRpb25fcGFzc2VkfX1oaWRkZW57ez99fVwiIGR0LWNyZWF0ZT1cInt7PWl0LmR0X2NyZWF0ZX19XCIgc29jaWFsLWZlZWQtaWQgPSBcInt7PWl0LmlkfX1cIj4gXFxcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJwdWxsLWxlZnRcIiBocmVmPVwie3s9aXQuYXV0aG9yX2xpbmt9fVwiIHRhcmdldD1cIl9ibGFua1wiPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwibWVkaWEtb2JqZWN0XCIgc3JjPVwie3s9aXQuYXV0aG9yX3BpY3R1cmV9fVwiPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgIDwvYT4gXFxcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtYm9keVwiPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD4gXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEte3s9aXQuc29jaWFsX25ldHdvcmt9fVwiPjwvaT4gXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXV0aG9yLXRpdGxlXCI+e3s9aXQuYXV0aG9yX25hbWV9fTwvc3Bhbj4gXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXV0ZWQgcHVsbC1yaWdodFwiPiB7ez1pdC50aW1lX2Fnb319PC9zcGFuPiAgIFxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4gXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlclwiPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzb2NpYWwtZmVlZC10ZXh0XCI+e3s9aXQudGV4dH19PC9wPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gXFxcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gXFxcclxuICAgICAgICAgICAgICAgIDwvZGl2PiBcXFxyXG4gICAgICAgICAgICAgICAge3s9aXQuYXR0YWNobWVudH19IFxcXHJcbiAgICAgICAgICAgIDwvZGl2PicsXHJcblxyXG5cclxuICAgICAgICAgICAgLy9kYXRlX2Zvcm1hdDogXCJMTExcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1N0cmluZzogRGlzcGxheSBmb3JtYXQgb2YgdGhlIGRhdGUgYXR0cmlidXRlIChzZWUgaHR0cDovL21vbWVudGpzLmNvbS9kb2NzLyMvZGlzcGxheWluZy9mb3JtYXQvKVxyXG4gICAgICAgICAgICBtb2RlcmF0aW9uOiBmdW5jdGlvbihjb250ZW50KSB7ICAgICAgICAgICAgICAgICAvL0Z1bmN0aW9uOiBpZiByZXR1cm5zIGZhbHNlLCB0ZW1wbGF0ZSB3aWxsIGhhdmUgY2xhc3MgaGlkZGVuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gIChjb250ZW50LnRleHQpID8gY29udGVudC50ZXh0LmluZGV4T2YoJ2Z1Y2snKSA9PSAtMSA6IHRydWU7XHJcbiAgICAgICAgICAgI
1302H0sXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRnVuY3Rpb246IFRoaXMgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBldm9rZWQgd2hlbiBhbGwgdGhlIHBvc3RzIGFyZSBjb2xsZWN0ZWQgYW5kIGRpc3BsYXllZFxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJBbGwgcG9zdHMgY29sbGVjdGVkIVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBUaGUgLmVhY2goKSBtZXRob2QgaXMgdW5uZWNlc3NhcnkgaGVyZTpcclxuICAgICAgICAkKCBcIi50d2l0dGVyLWZlZWRcIiApLmVhY2goZnVuY3Rpb24oKSB7IFxyXG4gICAgICAgICAgICB2YXIgdHd0SGFuZGxlID0gJCh0aGlzKS5kYXRhKFwiaGFuZGxlXCIpO1xyXG4gICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ2gyJykudGV4dCh0d3RIYW5kbGUuc3Vic3RyaW5nKDEpKTsgLy8gcmVtb3ZlIGZpcnN0IGNoYXIgKHJlcGxhY2VkIGluIGNzcylcclxuICAgICAgICAgICAgJCh0aGlzKS5zb2NpYWxmZWVkKHtcclxuICAgICAgICAgICAgICAgIC8vIFRXSVRURVJcclxuICAgICAgICAgICAgICAgIHR3aXR0ZXI6e1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRzOiBbIHR3dEhhbmRsZSBdLCBcclxuICAgICAgICAgICAgICAgICAgICAvL2FjY291bnRzOiBxdWVyeVRhZ3MsICAgICAgICAgICAgICAgICAgICAgIC8vQXJyYXk6IFNwZWNpZnkgYSBsaXN0IG9mIGFjY291bnRzIGZyb20gd2hpY2ggdG8gcHVsbCB0d2VldHNcclxuICAgICAgICAgICAgICAgICAgICBsaW1pdDogNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW50ZWdlcjogbWF4IG51bWJlciBvZiB0d2VldHMgdG8gbG9hZFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyX2tleTogJ1E0ekZYWndtTzJ1RDFSdTRhQ2lsWXdUbkInLCAgICAgICAgICAvL1N0cmluZzogY29uc3VtZXIga2V5LiBtYWtlIHN1cmUgdG8gaGF2ZSB5b3VyIGFwcCByZWFkLW9ubHlcclxuICAgICAgICAgICAgICAgICAgICBjb25zdW1lcl9zZWNyZXQ6ICdpVHpjMjM0REdDTnByd1hrRGtTMHhRY2M5bkdrQUJUQ2xRR09aNGVyOVk3V2thTUh1cicsLy9TdHJpbmc6IGNvbnN1bWVyIHNlY3JldCBrZXkuIG1ha2Ugc3VyZSB0byBoYXZlIHlvdXIgYXBwIHJlYWQtb25seVxyXG4gICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgLy8gR0VORVJBTCBTRVRUSU5HU1xyXG4gICAgICAgICAgICAgICAgbGVuZ3RoOjQwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnRlZ2VyOiBGb3IgcG9zdHMgd2l0aCB0ZXh0IGxvbmdlciB0aGFuIHRoaXMgbGVuZ3RoLCBzaG93IGFuIGVsbGlwc2lzLlxyXG4gICAgICAgICAgICAgICAgc2hvd19tZWRpYTp0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Cb29sZWFuOiBpZiBmYWxzZSwgZG9lc24ndCBkaXNwbGF5IGFueSBwb3N0IGltYWdlc1xyXG4gICAgICAgICAgICAgICAgbWVkaWFfbWluX3dpZHRoOiAzMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnRlZ2VyOiBPbmx5IGdldCBwb3N0cyB3aXRoIGltYWdlcyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlXHJcbiAgICAgICAgICAgICAgICAvL3VwZGF0ZV9wZXJpb2Q6IDUwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW50ZWdlcjogTnVtYmVyIG9mIHNlY29uZHMgYmVmb3JlIHNvY2lhbC1mZWVkIHdpbGwgYXR0ZW1wdCB0byBsb2FkIG5ldyBwb3N0cy5cclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBcInR3ZWV0Lmh0bWxcIiwgICAgICAgICAgICAgICAgICAgICAgICAgLy9TdHJpbmc6IEZpbGVuYW1lIHVzZWQgdG8gZ2V0IHRoZSBwb3N0IHRlbXBsYXRlLlxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaHRtbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TdHJpbmc6IEhUTUwgdXNlZCBmb3IgZWFjaCBwb3N0LiBUaGlzIG92ZXJyaWRlcyB0aGUgJ3RlbXBsYXRlJyBmaWxlbmFtZSBvcHRpb24gXHJcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInR3aXR0ZXItZmVlZC1lbGVtZW50IHt7PyAhaXQubW9kZXJhdGlvbl9wYXNzZWR9fWhpZGRlbnt7P319XCIgZHQtY3JlYXRlPVwie3s9aXQuZHRfY3JlYXRlfX1cIiBzb2NpYWwtZmVlZC1pZCA9IFwie3s9aXQuaWR9fVwiPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJ7ez1pdC5saW5rfX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4gXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1ib2R5XCI+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJkYXRlLXRpbWVcIj5Qb3N0IHt7PWl0LnRpbWVfYWdvfX08L3A+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlclwiPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInNvY2lhbC1mZWVkLXRleHRcIj57ez1pdC50ZXh0fX08L3A+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiBcXFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+JyxcclxuXHJcbiAgICAgICAgICAgICAgICAvL2RhdGVfZm9ybWF0OiBcIkxMTFwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3RyaW5nOiBEaXNwbGF5IGZvcm1hdCBvZiB0aGUgZGF0ZSBhdHRyaWJ1dGUgKHNlZSBodHRwOi8vbW9tZW50anMuY29tL2RvY3MvIy9kaXNwbGF5aW5nL2Zvcm1hdC8pXHJcbiAgICAgICAgICAgICAgICBtb2RlcmF0aW9uOiBmdW5jdGlvbihjb250ZW50KSB7ICAgICAgICAgICAgICAgICAvL0Z1bmN0aW9uOiBpZiByZXR1cm5zIGZhbHNlLCB0ZW1wbGF0ZSB3aWxsIGhhdmUgY2xhc3MgaGlkZGVuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAoY29udGVudC50ZXh0KSA/IGNvbnRlbnQudGV4dC5pbmRleE9mKCdmdWNrJykgPT0gLTEgOiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRnVuY3Rpb246IFRoaXMgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBldm9rZWQgd2hlbiBhbGwgdGhlIHBvc3RzIGFyZSBjb2xsZWN0ZWQgYW5kIGRpc3BsYXllZFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWxsIHBvc3RzIGNvbGxlY3RlZCFcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgI
1302H0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuXHR9XHJcbn07IiwidmFyIHN0aWNreUZvb3RlciA9IHtcclxuXHQkd2luZG93OiAkKHdpbmRvdyksXHJcblx0JGJvZHkgOiAkKCdib2R5JyksXHJcblx0JGhlYWRlciA6ICQoJ2hlYWRlcicpLFxyXG5cdCRtYWluIDogJCgnI21haW4nKSxcclxuXHQkd3JhcHBlciA6ICQoJyN3cmFwcGVyJyksXHJcblx0JGZvb3RlciA6JCgnZm9vdGVyJyksXHJcblxyXG5cdGRlc2t0b3BXaWR0aCA6IDEyODAsXHJcblx0cHJveHlSZXNpemUgOiBudWxsLFxyXG5cclxuXHRhY3RpdmVDbGFzczonaXMtYWN0aXZlJyxcclxuXHJcblx0aXNMaXN0ZW5pbmc6ZmFsc2UsXHJcblx0XHJcblx0aW5pdDogZnVuY3Rpb24oKSB7IFxyXG5cdFx0dGhpcy5wcm94eVJlc2l6ZSA9ICQucHJveHkodGhpcy5yZXNpemUsIHRoaXMpO1xyXG5cdFx0dGhpcy5saXN0ZW4oKTtcdFx0XHJcblx0XHR0aGlzLnJlc2l6ZSgpOyBcclxuXHR9LFxyXG5cclxuXHJcblx0cmVzaXplIDogZnVuY3Rpb24gKCkge1xyXG5cdFx0dmFyIG5IID0gdGhpcy5fZ2V0SW5uZXJIZWlnaHQoKSAtIHRoaXMuJGZvb3Rlci5vdXRlckhlaWdodCgpLFxyXG5cdFx0XHRjSCA9IHRoaXMuJGhlYWRlci5vdXRlckhlaWdodCh0cnVlKSArIHRoaXMuJG1haW4ub3V0ZXJIZWlnaHQoKSxcclxuXHRcdFx0Zm9vdGVySGVpZ2h0ID0gdGhpcy4kZm9vdGVyLmhlaWdodCgpO1xyXG5cdFx0XHR0aGlzLiRib2R5LmhlaWdodCAoJzEwMCUnKTtcclxuXHJcblx0XHRcdGNvbnNvbGUubG9nKHRoaXMuJGhlYWRlci5oZWlnaHQoKSwgdGhpcy4kaGVhZGVyLm91dGVySGVpZ2h0KHRydWUpKTtcclxuXHRcdGlmIChuSCA+IGNIICkgXHJcblx0XHR7XHJcblx0XHRcdGlmICghdGhpcy4kZm9vdGVyLmhhc0NsYXNzKCdzdGlja3ktZm9vdGVyJykpIHtcclxuXHRcdFx0XHR0aGlzLiRmb290ZXIuYWRkQ2xhc3MoJ3N0aWNreS1mb290ZXInKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0ZWxzZSBcclxuXHRcdHtcclxuXHRcdFx0aWYgKHRoaXMuJGZvb3Rlci5oYXNDbGFzcygnc3RpY2t5LWZvb3RlcicpKSB7XHJcblx0XHRcdFx0dGhpcy4kZm9vdGVyLnJlbW92ZUNsYXNzKCdzdGlja3ktZm9vdGVyJyk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRsaXN0ZW4gOiBmdW5jdGlvbiAoKSB7XHRcclxuXHRcdGlmICghdGhpcy5pc0xpc3RlbmluZykge1x0XHRcdFxyXG5cdFx0XHR0aGlzLmlzTGlzdGVuaW5nID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy4kd2luZG93Lm9uKCdyZXNpemUgb3JpZW50YXRpb25jaGFuZ2UnLCB0aGlzLnByb3h5UmVzaXplKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRjYW5jZWwgOiBmdW5jdGlvbiAoKSB7IFxyXG5cdFx0aWYgKHRoaXMuaXNMaXN0ZW5pbmcpIHtcclxuXHRcdFx0dGhpcy5pc0xpc3RlbmluZyA9IGZhbHNlO1x0XHJcblx0XHRcdHRoaXMuJHdpbmRvdy5vZmYoJ3Jlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZScsIHRoaXMucHJveHlSZXNpemUpO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cclxuICAgIF9nZXRJbm5lckhlaWdodCA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gd2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgfHwgZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQ7IFxyXG4gICAgfVxyXG5cclxufTtcclxuXHJcbiIsIlxyXG52YXIgc3RpY2t5SGVhZGVyID0ge1xyXG5cdCR3aW5kb3c6ICQod2luZG93KSxcclxuXHQkYm9keSA6ICQoJ2JvZHknKSxcclxuXHQvLyRoZWFkZXIgOiAkKCdoZWFkZXInKSxcclxuXHRkZXNrdG9wV2lkdGggOiAxMjgwLFxyXG5cdGxhc3RXaWR0aDowLFxyXG5cdHByb3h5U2Nyb2xsIDogbnVsbCxcclxuXHRzY3JvbGxQb3M6MSxcclxuXHRzdGlja3lDbGFzc25hbWU6J3N0aWNreS1oZWFkZXInLFxyXG5cdHJlc2l6ZUNsYXNzbmFtZToncmVzaXplJywgLy8gc3RvcHMgYWxsIHRyYW5zaXRpb25zIG9uIHJlc2l6ZVxyXG5cdGlzTGlzdGVuaW5nOmZhbHNlLFxyXG5cdHQ6MCxcclxuXHJcblx0aW5pdCA6IGZ1bmN0aW9uICgpIHtcclxuXHRcdHRoaXMucHJveHlTY3JvbGwgPSAkLnByb3h5KHRoaXMub25zY3JvbGwsIHRoaXMpO1xyXG5cdFx0dGhpcy4kd2luZG93Lm9uKCdyZXNpemUgb3JpZW50YXRpb25jaGFuZ2UnLCAkLnByb3h5KHRoaXMucmVzaXplLCB0aGlzKSk7XHJcblx0XHR0aGlzLmxhc3RXaWR0aCA9IHRoaXMuJHdpbmRvdy53aWR0aCgpO1xyXG5cdFx0dGhpcy5yZXNpemUoKTtcclxuXHR9LFxyXG5cclxuXHRyZXNpemUgOiBmdW5jdGlvbiAoZSkge1x0XHJcblx0XHR2YXIgdyA9IHRoaXMuX2dldElubmVyV2lkdGgoKTtcdFxyXG5cdFx0aWYgKCB3ID49IHRoaXMuZGVza3RvcFdpZHRoICkge1xyXG5cdFx0XHR0aGlzLmxpc3RlbigpO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBcclxuXHRcdHtcclxuXHRcdFx0dGhpcy5jYW5jZWwoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5sYXN0V2lkdGggIT09IHcgKSB7XHJcblx0XHRcdC8vIGFkZCBjbGFzcyB0byByZW1vdmUgdHJhbnNpdGlvbiBlZmZlY3RzIGR1cmluZyByZXNpemVcclxuXHRcdFx0aWYgKCF0aGlzLiRib2R5Lmhhc0NsYXNzKHRoaXMucmVzaXplQ2xhc3NuYW1lKSApIHtcclxuXHRcdFx0XHR0aGlzLiRib2R5LmFkZENsYXNzKHRoaXMucmVzaXplQ2xhc3NuYW1lKTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBvbiBjb21wbGV0ZSByZW1vdmVzIHJlc2l6ZSBjbGFzc1xyXG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy50KTtcclxuXHRcdFx0dGhpcy50ID0gc2V0VGltZW91dCgkLnByb3h5KHRoaXMucmVzaXplQ29tcGxldGUsIHRoaXMpLCA1MDApO1x0XHRcdFxyXG5cdFx0fVxyXG5cdFx0dGhpcy5sYXN0V2lkdGggPSB3O1xyXG5cdH0sXHJcblxyXG5cdGxpc3RlbiA6IGZ1bmN0aW9uICgpIHtcclxuXHRcdGlmICghdGhpcy5pc0xpc3RlbmluZykge1xyXG5cdFx0XHR0aGlzLmlzTGlzdGVuaW5nID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy4kd2luZG93Lm9uKCdzY3JvbGwnLCB0aGlzLnByb3h5U2Nyb2xsICk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Y2FuY2VsIDogZnVuY3Rpb24gKGUpIHtcclxuXHRcdGlmICh0aGlzLmlzTGlzdGVuaW5nKSB7XHJcblx0XHRcdHRoaXMuaXNMaXN0ZW5pbmcgPSBmYWxzZTtcdFxyXG5cdFx0XHR0aGlzLiR3aW5kb3cub2ZmKCdzY3JvbGwnLCB0aGlzLnNjcm9sbFByb3h5ICk7XHJcblx0XHR9XHJcblx0fSwgXHJcblxyXG5cdG9uc2Nyb2xsIDogZnVuY3Rpb24gKGUpIHtcclxuXHRcdGlmICh0aGlzLiR3aW5kb3cuc2Nyb2xsVG9wKCkgPiB0aGlzLnNjcm9sbFBvcyApIHtcclxuXHRcdFx0aWYgKCF0aGlzLiRib2R5Lmhhc0NsYXNzKHRoaXMuc3RpY2t5Q2xhc3NuYW1lKSApIHtcclxuXHRcdFx0XHR0aGlzLiRib2R5LmFkZENsYXNzKHRoaXMuc3RpY2t5Q2xhc3NuYW1lKTtcdFxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRlbHNlIFxyXG5cdFx0e1xyXG5cdFx0XHRpZiAodGhpcy4kYm9keS5oYXNDbGFzcyh0aGlzLnN0aWNreUNsYXNzbmFtZSkgKSB7XHJcblx0XHRcdFx0dGhpcy4kYm9keS5yZW1vdmVDbGFzcyh0aGlzLnN0aWNreUNsYXNzbmFtZSk7XHRcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHJlc2l6ZUNvbXBsZXRlIDogZnVuY3Rpb24gKCkge1xyXG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMudCk7XHJcblx0XHRpZiAodGhpcy4kYm9keS5oYXNDbGFzcyh0aGlzLnJlc2l6ZUNsYXNzbmFtZSkgKSB7XHJcblx0XHRcdHRoaXMuJGJvZHkucmVtb3ZlQ2xhc3ModGhpcy5yZXNpemVDbGFzc25hbWUpO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cclxuICAgIF9nZXRJbm5lcldpZHRoIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgI
1302HJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggfHwgZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDsgXHJcbiAgICB9LFxyXG5cclxuXHJcblxyXG59O1xyXG4iLCJ2YXIgdGFibGVFbGVtcyA9IHtcclxuXHJcblx0ZWxtczogICQoJy5tYWluIHRhYmxlJyksXHJcblxyXG5cdHRhYmxlRnVuY3Rpb246IGZ1bmN0aW9uKCkge1xyXG5cdFx0dGFibGVFbGVtcy5lbG1zLmVhY2goZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciAkdGhpcz0gJCh0aGlzKSwgXHJcblx0XHRcdFx0cGFyZW50ID0gJHRoaXMucGFyZW50KCk7XHJcblx0XHRcdFx0aWYgKCFwYXJlbnQuaGFzQ2xhc3MoJ3RhYmxlJykpXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0JHRoaXMud3JhcCgnPGRpdiBjbGFzcz1cInRhYmxlXCIvPicpO1xyXG5cdFx0XHRcdH1cdFx0XHRcdFxyXG5cdFx0fSk7XHJcblx0fSxcclxuXHJcblx0ZXZlbnRMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkge1xyXG5cdFx0aWYgKHRhYmxlRWxlbXMuZWxtcy5sZW5ndGggPiAwKSB7XHJcblx0ICAgICAgICB0YWJsZUVsZW1zLnRhYmxlRnVuY3Rpb24oKTtcclxuXHQgICAgfVxyXG5cdH0sXHJcblx0aW5pdDogZnVuY3Rpb24oKSB7IFxyXG5cdFx0dGFibGVFbGVtcy5ldmVudExpc3RlbmVycygpO1xyXG5cdH1cclxufTsiLCIvLyBUaGUgLmVhY2goKSBtZXRob2QgaXMgdW5uZWNlc3NhcnkgaGVyZTpcclxuXHJcblxyXG4vLyAkKCAnLnR3aXR0ZXItcGFuZWwnICkuZWFjaChmdW5jdGlvbigpIHtcclxuLy8gICB2YXIgdHd0SGFuZGxlID0gJCh0aGlzKS5kYXRhKCdoYW5kbGUnKSxcclxuLy8gICAgICAgICAkdGhpcyA9ICQodGhpcyk7XHJcblxyXG4vLyAgIC8vJHRoaXMuZmluZCgnaDInKS50ZXh0KHR3dEhhbmRsZS5zdWJzdHJpbmcoMSkpOyAvLyByZW1vdmUgZmlyc3QgY2hhciAocmVwbGFjZWQgaW4gY3NzKVxyXG5cclxuLy8gICAkdGhpcy5zb2NpYWxmZWVkKHtcclxuLy8gICAgICAgICAvLyBUV0lUVEVSXHJcbi8vICAgICAgICAgdHdpdHRlcjp7XHJcbi8vICAgICAgICAgICAgIGFjY291bnRzOiBbIHR3dEhhbmRsZSBdLCBcclxuLy8gICAgICAgICAgICAgLy9hY2NvdW50czogcXVlcnlUYWdzLCAgICAgICAgICAgICAgICAgICAgICAvL0FycmF5OiBTcGVjaWZ5IGEgbGlzdCBvZiBhY2NvdW50cyBmcm9tIHdoaWNoIHRvIHB1bGwgdHdlZXRzXHJcbi8vICAgICAgICAgICAgIGxpbWl0OiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnRlZ2VyOiBtYXggbnVtYmVyIG9mIHR3ZWV0cyB0byBsb2FkXHJcbi8vICAgICAgICAgICAgIGNvbnN1bWVyX2tleTogJ1E0ekZYWndtTzJ1RDFSdTRhQ2lsWXdUbkInLCAgICAgICAgICAvL1N0cmluZzogY29uc3VtZXIga2V5LiBtYWtlIHN1cmUgdG8gaGF2ZSB5b3VyIGFwcCByZWFkLW9ubHlcclxuLy8gICAgICAgICAgICAgY29uc3VtZXJfc2VjcmV0OiAnaVR6YzIzNERHQ05wcndYa0RrUzB4UWNjOW5Ha0FCVENsUUdPWjRlcjlZN1drYU1IdXInLC8vU3RyaW5nOiBjb25zdW1lciBzZWNyZXQga2V5LiBtYWtlIHN1cmUgdG8gaGF2ZSB5b3VyIGFwcCByZWFkLW9ubHlcclxuLy8gICAgICAgICAgfSxcclxuXHJcbi8vICAgICAgICAgLy8gR0VORVJBTCBTRVRUSU5HU1xyXG4vLyAgICAgICAgIGxlbmd0aDo0MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW50ZWdlcjogRm9yIHBvc3RzIHdpdGggdGV4dCBsb25nZXIgdGhhbiB0aGlzIGxlbmd0aCwgc2hvdyBhbiBlbGxpcHNpcy5cclxuLy8gICAgICAgICBzaG93X21lZGlhOmZhbHNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Cb29sZWFuOiBpZiBmYWxzZSwgZG9lc24ndCBkaXNwbGF5IGFueSBwb3N0IGltYWdlc1xyXG4vLyAgICAgICAgIG1lZGlhX21pbl93aWR0aDogMzAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW50ZWdlcjogT25seSBnZXQgcG9zdHMgd2l0aCBpbWFnZXMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZVxyXG4vLyAgICAgICAgIC8vdXBkYXRlX3BlcmlvZDogNTAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnRlZ2VyOiBOdW1iZXIgb2Ygc2Vjb25kcyBiZWZvcmUgc29jaWFsLWZlZWQgd2lsbCBhdHRlbXB0IHRvIGxvYWQgbmV3IHBvc3RzLlxyXG4vLyAgICAgICAgIHRlbXBsYXRlOiAndHdlZXQuaHRtbCcsICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3RyaW5nOiBGaWxlbmFtZSB1c2VkIHRvIGdldCB0aGUgcG9zdCB0ZW1wbGF0ZS5cclxuLy8gICAgICAgICB0ZW1wbGF0ZV9odG1sOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3RyaW5nOiBIVE1MIHVzZWQgZm9yIGVhY2ggcG9zdC4gVGhpcyBvdmVycmlkZXMgdGhlICd0ZW1wbGF0ZScgZmlsZW5hbWUgb3B0aW9uXHJcbiAgICAgICAgXHJcbi8vICAgICAgICAgICAgICAgICAgICAgJzxwIGNsYXNzPVwiZGF0ZS10aW1lXCI+UG9zdCB7ez1pdC50aW1lX2Fnb319PC9wPiBcXFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXJcIj4gXFxcclxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cInt7PWl0Lmxpbmt9fVwiIHRhcmdldD1cIl9ibGFua1wiPiBcXFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzb2NpYWwtZmVlZC10ZXh0XCI+e3s9aXQudGV4dH19PC9wPiBcXFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+IFxcXHJcbi8vICAgICAgICAgICAgICAgICAgICAgPC9kaXY+JyxcclxuXHJcbi8vICAgICAgICAgLy9kYXRlX2Zvcm1hdDogXCJMTExcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1N0cmluZzogRGlzcGxheSBmb3JtYXQgb2YgdGhlIGRhdGUgYXR0cmlidXRlIChzZWUgaHR0cDovL21vbWVudGpzLmNvbS9kb2NzLyMvZGlzcGxheWluZy9mb3JtYXQvKVxyXG4vLyAgICAgICAgIG1vZGVyYXRpb246IGZ1bmN0aW9uKGNvbnRlbnQpIHsgICAgICAgICAgICAgICAgIC8vRnVuY3Rpb246IGlmIHJldHVybnMgZmFsc2UsIHRlbXBsYXRlIHdpbGwgaGF2ZSBjbGFzcyBoaWRkZW5cclxuLy8gICAgICAgICAgICAgcmV0dXJuICAoY29udGVudC50ZXh0KSA/IGNvbnRlbnQudGV4dC5pbmRleE9mKCdmdWNrJykgPT0gLTEgOiB0cnVlO1xyXG4vLyAgICAgICAgI
1302H0sXHJcbi8vICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GdW5jdGlvbjogVGhpcyBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIGlzIGV2b2tlZCB3aGVuIGFsbCB0aGUgcG9zdHMgYXJlIGNvbGxlY3RlZCBhbmQgZGlzcGxheWVkXHJcbi8vICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBbGwgcG9zdHMgY29sbGVjdGVkIScpO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgIH0pO1xyXG4vLyB9KTsiLCJcclxuLy8gICoqKioqKioqKioqKioqKioqKioqKioqXHJcbi8vICAkJCBEb2N1bWVudCByZWFkeVxyXG4vLyAgKioqKioqKioqKioqKioqKioqKioqKipcclxuKGZ1bmN0aW9uKCQpIHtcclxuICAkKGZ1bmN0aW9uKCkge1xyXG4gIFx0d2luZG93LndpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgXHR3aW5kb3cud2luZG93SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xyXG5cclxuICBcdHdpbmRvdy5pc2lQaG9uZSA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdpcGhvbmUnKTtcclxuICBcdHdpbmRvdy5pc2lQYWQgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignaXBhZCcpO1xyXG4gIFx0d2luZG93LmlzaVBvZCA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdpcG9kJyk7XHJcbiAgICB3aW5kb3cuaXNGaXJlZm94ID0gKG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdmaXJlZm94JykgPiAtMSk7XHJcblxyXG4gIFx0d2luZG93LnRhYmxldCA9IDc2ODtcclxuICBcdHdpbmRvdy50YWJsZXRXaWRlID0gMTAyNDtcclxuICBcdHdpbmRvdy5kZXNrdG9wID0gMTI4MDtcclxuICAgIFxyXG5cclxuXHJcbiAgICAvLyBBZGQgZnVuY3Rpb25zIGhlcmVcclxuXHJcbiAgICBoZWFkZXJTY3JvbGwuaW5pdCgpO1xyXG4gICAgZm9vdGVyUG9zLmluaXQoKTtcclxuICAgIG5hdk92ZXJsYXkuaW5pdCgpO1xyXG4gICAgbW9iaWxlTmF2LmluaXQoKTtcclxuICAgIFxyXG4gICAgYWNjb3JkaW9uLmluaXQoKTtcclxuXHJcbiAgICBzb2NpYWxGZWVkLmluaXQoKTtcclxuXHJcbiAgICBidXJnZXJFbGVtcy5pbml0KCk7XHJcbiAgICBjb250ZW50TmF2LmluaXQoKTtcclxuICAgIGhpc3RvcnlUaW1lbGluZS5pbml0KCk7XHJcblxyXG4gICAgLy8gc3RpY2t5SGVhZGVyLmluaXQoKTsgXHJcbiAgICAvLyBzdGlja3lGb290ZXIuaW5pdCgpO1xyXG4gICAgbWVkaWFHYWxsZXJ5LmluaXQoKTtcclxuICAgIHRhYmxlRWxlbXMuaW5pdCgpOyBcclxuICAgIGNvbnRhY3RPcHRpb25zLmluaXQoKTsgXHJcbiAgICBidHQuaW5pdCgpO1xyXG5cclxuICAgICQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICQoJy5maXQtdmlkZW8nKS5maXRWaWRzKCk7XHJcbiAgICB9KTtcclxuICAgICQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICQoJy5wYW5lbCAuaW1hZ2UgaW1nJykubGF6eSh7XHJcbiAgICAgICAgZWZmZWN0OiBcImZhZGVJblwiLFxyXG4gICAgICAgIGVmZmVjdFRpbWU6IDMwMCxcclxuICAgICAgICB0aHJlc2hvbGQ6IDc1XHJcbiAgICAgIH0pO1xyXG4gICAgICAkKCcucGFuZWwgLmNvcHknKS5tYXRjaEhlaWdodCgpO1xyXG4gICAgfSk7XHJcbiAgICBpZiAoICQoIHdpbmRvdyApLndpZHRoKCkgPD0gMTI4MCkge1xyXG4gICAgICAkKCcubmF2LXdyYXBwZXInKS5hZGRDbGFzcygnaW4tbW9iaWxlJyk7XHJcbiAgICAgICQoJy5uYXYtd3JhcHBlcicpLnJlbW92ZUNsYXNzKCdpbi1sYXJnZScpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgJCgnLm5hdi13cmFwcGVyJykucmVtb3ZlQ2xhc3MoJ2luLW1vYmlsZScpO1xyXG4gICAgICAkKCcubmF2LXdyYXBwZXInKS5hZGRDbGFzcygnaW4tbGFyZ2UnKTtcclxuICAgIH1cclxuICAgICQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljayB0b3VjaCcsJy5nYWxsZXJ5LWZpbHRlciAudHJpZ2dlcicsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAkKHRoaXMpLnRvZ2dsZUNsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAkKHRoaXMpLm5leHQoKS50b2dnbGVDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICAkKGZ1bmN0aW9uKCkge1xyXG4gICAgICAkKGRvY3VtZW50KS5vbignY2xpY2sgdG91Y2gnLCcuYXN4LWhlYWRlciAuYnV0dG9uJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgJCh0aGlzKS50b2dnbGVDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgICAgLy8kKHRoaXMpLm5leHQoKS50b2dnbGVDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgICQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljayB0b3VjaCcsICcudG5jJywgZnVuY3Rpb24oKSB7IFxyXG4gICAgICAgIHZhciAkY2hrID0gJCh0aGlzKS5maW5kKCdpbnB1dFt0eXBlPWNoZWNrYm94XScpO1xyXG4gICAgICAgICRjaGsucHJvcCgnY2hlY2tlZCcsICRjaGsuaXMoJzpjaGVja2VkJykgPyBmYWxzZSA6IHRydWUpO1xyXG4gICAgICB9KVxyXG4gICAgfSk7XHJcbiAgfSk7XHJcblxyXG4gIC8vVE9ETyBUSURZIFRISVMgSU5UTyBQQVJUSUFMXHJcbnZhciBzdGlja3lIZWFkZXJzID0gKGZ1bmN0aW9uKCkge1xyXG5cclxuICB2YXIgJHN0aWNraWVzLFxyXG4gICAgICAkb2Zmc2V0O1xyXG5cclxuICB2YXIgbG9hZCA9IGZ1bmN0aW9uKHN0aWNraWVzLCB0YXJnZXQsIG9mZnNldCkge1xyXG4gICAgXHJcbiAgICAkb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBzdGlja2llcyA9PT0gXCJvYmplY3RcIiAmJiBzdGlja2llcyBpbnN0YW5jZW9mIGpRdWVyeSAmJiBzdGlja2llcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAkc3RpY2tpZXMgPSBzdGlja2llcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB2Y
1302XIgJHRoaXNTdGlja3kgPSAkKHRoaXMpO1xyXG4gIFxyXG4gICAgICAgICR0aGlzU3RpY2t5XHJcbiAgICAgICAgICAgIC5kYXRhKCdvcmlnaW5hbFBvc2l0aW9uJywgJHRoaXNTdGlja3kub2Zmc2V0KCkudG9wKVxyXG4gICAgICAgICAgICAuZGF0YSgnb3JpZ2luYWxIZWlnaHQnLCAkdGhpc1N0aWNreS5vdXRlckhlaWdodCgpKTsgICAgICAgICBcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0YXJnZXQub2ZmKFwic2Nyb2xsLnN0aWNraWVzXCIpLm9uKFwic2Nyb2xsLnN0aWNraWVzXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgX3doZW5TY3JvbGxpbmcoZXZlbnQpOyAgICBcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgdmFyIF93aGVuU2Nyb2xsaW5nID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgIFxyXG4gICAgdmFyICRzY3JvbGxUb3AgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNjcm9sbFRvcCgpICsgJG9mZnNldDtcclxuXHJcbiAgICAkc3RpY2tpZXMuZWFjaChmdW5jdGlvbihpKSB7ICAgICAgXHJcblxyXG4gICAgICB2YXIgJHRoaXNTdGlja3kgPSAkKHRoaXMpLFxyXG4gICAgICAgICAgJHN0aWNreVBvc2l0aW9uID0gJHRoaXNTdGlja3kuZGF0YSgnb3JpZ2luYWxQb3NpdGlvbicpLFxyXG4gICAgICAgICAgJG5ld1Bvc2l0aW9uLFxyXG4gICAgICAgICAgJG5leHRTdGlja3k7XHJcblxyXG4gICAgICBpZiAoJHN0aWNreVBvc2l0aW9uIDw9ICRzY3JvbGxUb3ApIHtcclxuICAgICAgICBcclxuICAgICAgICAkbmV3UG9zaXRpb24gPSBNYXRoLm1heCgwLCAkc2Nyb2xsVG9wIC0gJHN0aWNreVBvc2l0aW9uKTtcclxuICAgICAgICAkbmV4dFN0aWNreSA9ICRzdGlja2llcy5lcShpICsgMSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYoJG5leHRTdGlja3kubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAkbmV3UG9zaXRpb24gPSBNYXRoLm1pbigkbmV3UG9zaXRpb24sICgkbmV4dFN0aWNreS5kYXRhKCdvcmlnaW5hbFBvc2l0aW9uJykgLSAkc3RpY2t5UG9zaXRpb24pIC0gJHRoaXNTdGlja3kuZGF0YSgnb3JpZ2luYWxIZWlnaHQnKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBcclxuICAgICAgICAkbmV3UG9zaXRpb24gPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAkdGhpc1N0aWNreS5jc3MoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGVZKCcgKyAkbmV3UG9zaXRpb24gKyAncHgpJyk7XHJcbiAgICAgIFxyXG4gICAgICAvL2NvdWxkIGp1c3QgYXMgZWFzaWx5IHVzZSB0b3AgaW5zdGVhZCBvZiB0cmFuc2Zvcm1cclxuICAgICAgLy8kdGhpc1N0aWNreS5jc3MoJ3RvcCcsICRuZXdQb3NpdGlvbiArICdweCcpO1xyXG4gICAgfSk7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGxvYWQ6IGxvYWRcclxuICB9O1xyXG59KSgpO1xyXG5cclxuJCh3aW5kb3cpLmxvYWQoZnVuY3Rpb24oKSB7XHJcbiAgaWYgKCAkKCB3aW5kb3cgKS53aWR0aCgpID49IDEwMjUpIHtcclxuICAgIHN0aWNreUhlYWRlcnMubG9hZCgkKFwiLnlsYWJlbFwiKSwgJCh3aW5kb3cpLCAxMDApO1xyXG4gIH1cclxuICBpZiAoICQoIHdpbmRvdyApLndpZHRoKCkgPj0gNzcwKSB7XHJcbiAgICAkKCcud3JhcHBlci5uby1pbWFnZScpLmVhY2goZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciAkcHJldkl0ZW1IZWlnaHQgPSAkKHRoaXMpLnBhcmVudCgpLnByZXYoJy5kYXknKS5oZWlnaHQoKTtcclxuICAgICAgJCh0aGlzKS5oZWlnaHQoJHByZXZJdGVtSGVpZ2h0KTtcclxuICAgIH0pOyBcclxuICB9ICAgIFxyXG59KTtcclxuXHJcbiQoZG9jdW1lbnQpLmZvdW5kYXRpb24oKTtcclxufSkoalF1ZXJ5KTtcclxuXHJcbiIsIi8vICAqKioqKioqKioqKioqKioqKioqKioqKlxyXG4vLyAgJCQgU21hcnQgcmVzaXplXHJcbi8vICAqKioqKioqKioqKioqKioqKioqKioqKlxyXG4oZnVuY3Rpb24gKCQsIHNyKSB7XHJcblx0dmFyIGRlYm91bmNlID0gZnVuY3Rpb24gKGZ1bmMsIHRocmVzaG9sZCwgZXhlY0FzYXApIHtcclxuXHRcdHZhciB0aW1lb3V0O1xyXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcclxuXHRcdFx0dmFyIG9iaiA9IHRoaXMsXHJcblx0XHRcdFx0YXJncyA9IGFyZ3VtZW50cztcclxuXHRcdFx0ZnVuY3Rpb24gZGVsYXllZCgpIHtcclxuXHRcdFx0XHRpZiAoIWV4ZWNBc2FwKSB7XHJcblx0XHRcdFx0XHRmdW5jLmFwcGx5KG9iaiwgYXJncyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRpbWVvdXQgPSBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aW1lb3V0KSB7XHJcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKGV4ZWNBc2FwKSB7XHJcblx0XHRcdFx0ZnVuYy5hcHBseShvYmosIGFyZ3MpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRpbWVvdXQgPSBzZXRUaW1lb3V0KGRlbGF5ZWQsIHRocmVzaG9sZCB8fCAyMDApO1xyXG5cdFx0fTtcclxuXHR9O1xyXG5cdGpRdWVyeS5mbltzcl0gPSBmdW5jdGlvbiAoZm4pIHtcclxuXHRcdHJldHVybiBmbiA/IHRoaXMuYmluZCgncmVzaXplJywgZGVib3VuY2UoZm4pKSA6IHRoaXMudHJpZ2dlcihzcik7XHJcblx0fTtcclxufSkoalF1ZXJ5LCAnc21hcnRyZXNpemUnKTsgLy8gRW5kIHNtYXJ0cmVzaXplXHJcblxyXG52YXIgcmVzaXplVGltZXI7XHJcbiQod2luZG93KS5zbWFydHJlc2l6ZShmdW5jdGlvbiAoKSB7XHJcblx0d2luZG93Lm5ld1dpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcblx0d2luZG93Lm5ld1dpbmRvd0hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuXHJcblx0dmFyIG5ld1dpbmRvd1dpZHRoUmVzdWx0ID0gbmV3V2luZG93V2lkdGggKiAwLjY2LFxyXG5cdFx0JG5hdldyYXBwZXIgPSAkKCcubmF2LXdyYXBwZXInKTtcclxuXHQgXHJcblx0d2luZG93LndpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcblx0d2luZG93LndpbmRvd0hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuXHRpZiAoICQoIHdpbmRvdyApLndpZHR
1302oKCkgPCAxMDI0KSB7IC8vIGNoYW5nZWQgdG8gMTI4MFxyXG5cdFx0Zm9vdGVyUG9zLmluaXQoKTtcclxuXHR9XHJcblx0aWYgKCAkKCB3aW5kb3cgKS53aWR0aCgpIDw9IDEyODApIHsgLy8gY2hhbmdlZCB0byAxMjgwXHJcblx0XHQkbmF2V3JhcHBlci5hZGRDbGFzcygnaW4tbW9iaWxlJyk7XHJcblx0XHQkbmF2V3JhcHBlci5yZW1vdmVDbGFzcygnaW4tbGFyZ2UnKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0JG5hdldyYXBwZXIucmVtb3ZlQ2xhc3MoJ2luLW1vYmlsZScpO1xyXG5cdFx0JG5hdldyYXBwZXIuYWRkQ2xhc3MoJ2luLWxhcmdlJyk7XHJcblx0XHRpZiAoICRuYXZXcmFwcGVyLmhhc0NsYXNzKCdtYmwtYWN0aXZlJykpIHtcclxuXHRcdFx0JG5hdldyYXBwZXIucmVtb3ZlQ2xhc3MoJ21ibC1hY3RpdmUnKTtcclxuXHRcdFx0JCgnLmJ1cmdlci1idXR0b24nKS5yZW1vdmVDbGFzcygnaXMtYWN0aXZlJyk7XHJcblx0XHRcdCQoJyNtYWluJykucmVtb3ZlQ2xhc3MoJ292ZXJsYXknKTtcclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKCAkKCB3aW5kb3cgKS53aWR0aCgpID49IDc2MCkgeyAvLyBjaGFuZ2VkIHRvIDEyODBcclxuXHRcdCQoJy53cmFwcGVyLm5vLWltYWdlJykuZWFjaChmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyICRwcmV2SXRlbUhlaWdodCA9ICQodGhpcykucGFyZW50KCkucHJldignLmRheScpLmhlaWdodCgpO1xyXG5cdFx0XHQkKHRoaXMpLmhlaWdodCgkcHJldkl0ZW1IZWlnaHQpO1xyXG5cdFx0fSk7XHRcclxuXHR9XHJcblx0aWYgKCQoJy5tZy1ncmlkJykubGVuZ3RoID4gMCkge1xyXG5cdFx0JCgnLm1nLWdyaWQgbGknKS5yZW1vdmVBdHRyKCdzdHlsZScpO1xyXG5cdH1cclxuXHJcblx0Ly8gSklSQTogV0VTRi0yMFxyXG5cdC8vIE9ubHkgYXBwbHkgdGhlIHJlc2l6ZSBmaXggaWYgbm90IGluIFNpdGVmaW5pdHkgZWRpdG9yXHJcblx0aWYgKCQoJy5zZlBhZ2VFZGl0b3InKS5sZW5ndGggPT0gMCkge1xyXG5cdFx0JCgnYm9keScpLmFkZENsYXNzKCdyZXNpemUnKTtcclxuXHRcdGNsZWFyVGltZW91dChyZXNpemVUaW1lcik7XHJcblx0XHRyZXNpemVUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcblx0XHRcdCQoJ2JvZHknKS5yZW1vdmVDbGFzcygncmVzaXplJyk7XHJcblx0XHRcdC8vIFJ1biBjb2RlIGhlcmUsIHJlc2l6aW5nIGhhcyBcInN0b3BwZWRcIiAgICAgICAgXHJcblx0XHR9LCAyNTApO1xyXG5cdH0gXHJcbn0pOyIsIn0pOy8vIGpRdWVyeSBlbmRcclxuLy8gbm8gd3JpdGluZyBpbiB0aGlzIGZpbGUiLCIiXX0=
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.