Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Created February 2, 2016 21:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timelyportfolio/6ce03d4324634feba4a9 to your computer and use it in GitHub Desktop.
Save timelyportfolio/6ce03d4324634feba4a9 to your computer and use it in GitHub Desktop.
ggplot and textures.js

Built with blockbuilder.org and R

In response to this StackOverflow question geom_bar: color gradient and cross hatches (using gridSVG), transparency issue, I did this. I wanted to see if combining svglite, htmltools, d3.js, and textures.js might achieve the desired result.

    library("ggplot2")
    library("gridSVG")
    library("gridExtra")
    library("dplyr")
    library("RColorBrewer")
    
    dfso <- structure(list(Sample = c("S1", "S2", "S1", "S2", "S1", "S2"), 
                           qvalue = c(14.704287341, 8.1682824035, 13.5471896224, 6.71158432425, 
                                      12.3900919038, 5.254886245), type = structure(c(1L, 1L, 2L, 
                                                                                      2L, 3L, 3L), .Label = c("A", "overlap", "B"), class = "factor"), 
                           value = c(897L, 1082L, 503L, 219L, 388L, 165L)), class = c("tbl_df", 
                                                                                      "tbl", "data.frame"), row.names = c(NA, -6L), .Names = c("Sample", 
                                                                                                                                               "qvalue", "type", "value"))
    
    cols <- brewer.pal(7,"YlOrRd")
    pso <- ggplot(dfso)+
      geom_bar(aes(x = Sample, y = value, fill = qvalue), width = .8, colour = "black", stat = "identity", position = "stack", alpha = 1)+
      ylim(c(0,2000)) + 
      theme_classic(18)+
      theme( panel.grid.major = element_line(colour = "grey80"),
             panel.grid.major.x = element_blank(),
             panel.grid.minor = element_blank(),
             legend.key = element_blank(),
             axis.text.x = element_text(angle = 90, vjust = 0.5))+
      ylab("Count")+
      scale_fill_gradientn("-log10(qvalue)", colours = cols, limits = c(0, 20))
    
    # use svglite and htmltools
    library(svglite)
    library(htmltools)
    
    # get the svg as tag
    pso_svg <- htmlSVG(print(pso),height=10,width = 14)
    
    browsable(
      attachDependencies(
        tagList(
          pso_svg,
          tags$script(
            sprintf(
    "
      var data = %s
    
      var svg = d3.select('svg');
    
      svg.select('style').remove();
    
      var bars = svg.selectAll('rect:not(:last-of-type):not(:first-of-type)')
         .data(d3.merge(d3.values(d3.nest().key(function(d){return d.Sample}).map(data))))
      
      bars.style('fill',function(d){
        var t = textures
                  .lines()
                  .background(d3.rgb(d3.select(this).style('fill')).toString());
    
        if(d.type === 'A') t.orientation('2/8');
        if(d.type === 'overlap') t.orientation('2/8','6/8');
        if(d.type === 'B') t.orientation('6/8');
    
        svg.call(t);
        return t.url();
      });
    "    
              ,
              jsonlite::toJSON(dfso)
            )
          )
        ),
        list(
          htmlDependency(
            name = "d3",
            version = "3.5",
            src = c(href = "http://d3js.org"),
            script = "d3.v3.min.js"
          ),
          htmlDependency(
            name = "textures",
            version = "1.0.3",
            src = c(href = "https://rawgit.com/riccardoscalco/textures/master/"),
            script = "textures.min.js"
          )
        )
      )
    )
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/javascript; charset=utf-8;base64,IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbiYmKG4ub3duZXJEb2N1bWVudHx8bi5kb2N1bWVudHx8bikuZG9jdW1lbnRFbGVtZW50fWZ1bmN0aW9uIHQobil7cmV0dXJuIG4mJihuLm93bmVyRG9jdW1lbnQmJm4ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8bi5kb2N1bWVudCYmbnx8bi5kZWZhdWx0Vmlldyl9ZnVuY3Rpb24gZShuLHQpe3JldHVybiB0Pm4/LTE6bj50PzE6bj49dD8wOk5hTn1mdW5jdGlvbiByKG4pe3JldHVybiBudWxsPT09bj9OYU46K259ZnVuY3Rpb24gdShuKXtyZXR1cm4haXNOYU4obil9ZnVuY3Rpb24gaShuKXtyZXR1cm57bGVmdDpmdW5jdGlvbih0LGUscix1KXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYocj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJih1PXQubGVuZ3RoKTt1PnI7KXt2YXIgaT1yK3U+Pj4xO24odFtpXSxlKTwwP3I9aSsxOnU9aX1yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24odCxlLHIsdSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYodT10Lmxlbmd0aCk7dT5yOyl7dmFyIGk9cit1Pj4+MTtuKHRbaV0sZSk+MD91PWk6cj1pKzF9cmV0dXJuIHJ9fX1mdW5jdGlvbiBhKG4pe3JldHVybiBuLmxlbmd0aH1mdW5jdGlvbiBvKG4pe2Zvcih2YXIgdD0xO24qdCUxOyl0Kj0xMDtyZXR1cm4gdH1mdW5jdGlvbiBsKG4sdCl7Zm9yKHZhciBlIGluIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGUse3ZhbHVlOnRbZV0sZW51bWVyYWJsZTohMX0pfWZ1bmN0aW9uIGMoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBzKG4pe3JldHVybihuKz0iIik9PT14YXx8blswXT09PWJhP2JhK246bn1mdW5jdGlvbiBmKG4pe3JldHVybihuKz0iIilbMF09PT1iYT9uLnNsaWNlKDEpOm59ZnVuY3Rpb24gaChuKXtyZXR1cm4gcyhuKWluIHRoaXMuX31mdW5jdGlvbiBnKG4pe3JldHVybihuPXMobikpaW4gdGhpcy5fJiZkZWxldGUgdGhpcy5fW25dfWZ1bmN0aW9uIHAoKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaChmKHQpKTtyZXR1cm4gbn1mdW5jdGlvbiB2KCl7dmFyIG49MDtmb3IodmFyIHQgaW4gdGhpcy5fKSsrbjtyZXR1cm4gbn1mdW5jdGlvbiBkKCl7Zm9yKHZhciBuIGluIHRoaXMuXylyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBtKCl7dGhpcy5fPU9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24geShuKXtyZXR1cm4gbn1mdW5jdGlvbiBNKG4sdCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1lLmFwcGx5KHQsYXJndW1lbnRzKTtyZXR1cm4gcj09PXQ/bjpyfX1mdW5jdGlvbiB4KG4sdCl7aWYodCBpbiBuKXJldHVybiB0O3Q9dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2Zvcih2YXIgZT0wLHI9X2EubGVuZ3RoO3I+ZTsrK2Upe3ZhciB1PV9hW2VdK3Q7aWYodSBpbiBuKXJldHVybiB1fX1mdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIF8oKXt9ZnVuY3Rpb24gdyhuKXtmdW5jdGlvbiB0KCl7Zm9yKHZhciB0LHI9ZSx1PS0xLGk9ci5sZW5ndGg7Kyt1PGk7KSh0PXJbdV0ub24pJiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbn12YXIgZT1bXSxyPW5ldyBjO3JldHVybiB0Lm9uPWZ1bmN0aW9uKHQsdSl7dmFyIGksYT1yLmdldCh0KTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP2EmJmEub246KGEmJihhLm9uPW51bGwsZT1lLnNsaWNlKDAsaT1lLmluZGV4T2YoYSkpLmNvbmNhdChlLnNsaWNlKGkrMSkpLHIucmVtb3ZlKHQpKSx1JiZlLnB1c2goci5zZXQodCx7b246dX0pKSxuKX0sdH1mdW5jdGlvbiBTKCl7b2EuZXZlbnQucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBrKCl7Zm9yKHZhciBuLHQ9b2EuZXZlbnQ7bj10LnNvdXJjZUV2ZW50Oyl0PW47cmV0dXJuIHR9ZnVuY3Rpb24gTihuKXtmb3IodmFyIHQ9bmV3IF8sZT0wLHI9YXJndW1lbnRzLmxlbmd0aDsrK2U8cjspdFthcmd1bWVudHNbZV1dPXcodCk7cmV0dXJuIHQub2Y9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24odSl7dHJ5e3ZhciBpPXUuc291cmNlRXZlbnQ9b2EuZXZlbnQ7dS50YXJnZXQ9bixvYS5ldmVudD11LHRbdS50eXBlXS5hcHBseShlLHIpfWZpbmFsbHl7b2EuZXZlbnQ9aX19fSx0fWZ1bmN0aW9uIEUobil7cmV0dXJuIFNhKG4sQWEpLG59ZnVuY3Rpb24gQShuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmZ1bmN0aW9uKCl7cmV0dXJuIGthKG4sdGhpcyl9fWZ1bmN0aW9uIEMobil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmdW5jdGlvbigpe3JldHVybiBOYShuLHRoaXMpfX1mdW5jdGlvbiB6KG4sdCl7ZnVuY3Rpb24gZSgpe3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pfWZ1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCl9ZnVuY3Rpb24gdSgpe3RoaXMuc2V0QXR0cmlidXRlKG4sdCl9ZnVuY3Rpb24gaSgpe3RoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLHQpfWZ1bmN0aW9uIGEoKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pOnRoaXMuc2V0QXR0cmlidXRlKG4sZSl9ZnVuY3Rpb24gbygpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLGUpfXJldHVybiBuPW9hLm5zLnF1YWxpZnkobiksbnVsbD09dD9uLmxvY2FsP3I6ZToiZnVuY3Rpb24iPT10eXBlb2YgdD9uLmxvY2FsP286YTpuLmxvY2FsP2k6dX1mdW5jdGlvbiBMKG4pe3JldHVybiBuLnRyaW0oKS5yZXBsYWNlKC9ccysvZywiICIpfWZ1bmN0aW9uIHEobil7cmV0dXJuIG5ldyBSZWdFeHAoIig/Ol58XFxzKykiK29hLnJlcXVvdGUobikrIig/Olxccyt8JCkiLCJnIil9ZnVuY3Rpb24gVChuKXtyZXR1cm4obisiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIFIobix0KXtmdW5jdGlvbiBlKCl7Zm9yKHZhciBlPS0xOysrZTx1OyluW2VdKHRoaXMsdCl9ZnVuY3Rpb24gcigpe2Zvcih2YXIgZT0tMSxyPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpOysrZTx1OyluW2VdKHRoaXMscil9bj1UKG4pLm1hcChEKTt2YXIgdT1uLmxlbmd0aDtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD9yOmV9ZnVuY3Rpb24gRChuKXt2YXIgdD1xKG4pO3JldHVybiBmdW5jdGlvbihlLHIpe2lmKHU9ZS5jbGFzc0xpc3QpcmV0dXJuIHI/dS5hZGQobik6dS5yZW1vdmUobik7dmFyIHU9ZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiO3I/KHQubGFzdEluZGV4PTAsdC50ZXN0KHUpfHxlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLEwodSsiICIrbikpKTplLnNldEF0dHJpYnV0ZSgiY2xhc3MiLEwodS5yZXBsYWNlKHQsIiAiKSkpfX1mdW5jdGlvbiBQKG4sdCxlKXtmdW5jdGlvbiByKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiB1KCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHQsZSl9ZnVuY3Rpb24gaSgpe3ZhciByPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4scixlKX1yZXR1cm4gbnVsbD09dD9yOiJmdW5jdGlvbiI9PXR5cGVvZiB0P2k6dX1mdW5jdGlvbiBVKG4sdCl7ZnVuY3Rpb24gZSgpe2RlbGV0ZSB0aGlzW25dfWZ1bmN0aW9uIHIoKXt0aGlzW25dPXR9ZnVuY3Rpb24gdSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/ZGVsZXRlIHRoaXNbbl06dGhpc1tuXT1lfXJldHVybiBudWxsPT10P2U6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dTpyfWZ1bmN0aW9uIGoobil7ZnVuY3Rpb24gdCgpe3ZhciB0PXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlJiZlIT09dC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJP3QuY3JlYXRlRWxlbWVudE5TKGUsbik6dC5jcmVhdGVFbGVtZW50KG4pfWZ1bmN0aW9uIGUoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuLnNwYWNlLG4ubG9jYWwpfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246KG49b2EubnMucXVhbGlmeShuKSkubG9jYWw/ZTp0fWZ1bmN0aW9uIEYoKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7biYmbi5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBIKG4pe3JldHVybntfX2RhdGFfXzpufX1mdW5jdGlvbiBPKG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBFYSh0aGlzLG4pfX1mdW5jdGlvbiBJKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RofHwobj1lKSxmdW5jdGlvbih0LGUpe3JldHVybiB0JiZlP24odC5fX2RhdGFfXyxlLl9fZGF0YV9fKTohdC0hZX19ZnVuY3Rpb24gWShuLHQpe2Zvcih2YXIgZT0wLHI9bi5sZW5ndGg7cj5lO2UrKylmb3IodmFyIHUsaT1uW2VdLGE9MCxvPWkubGVuZ3RoO28+YTthKyspKHU9aVthXSkmJnQodSxhLGUpO3JldHVybiBufWZ1bmN0aW9uIFoobil7cmV0dXJuIFNhKG4semEpLG59ZnVuY3Rpb24gVihuKXt2YXIgdCxlO3JldHVybiBmdW5jdGlvbihyLHUsaSl7dmFyIGEsbz1uW2ldLnVwZGF0ZSxsPW8ubGVuZ3RoO2ZvcihpIT1lJiYoZT1pLHQ9MCksdT49dCYmKHQ9dSsxKTshKGE9b1t0XSkmJisrdDxsOyk7cmV0dXJuIGF9fWZ1bmN0aW9uIFgobix0LGUpe2Z1bmN0aW9uIHIoKXt2YXIgdD10aGlzW2FdO3QmJih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobix0LHQuJCksZGVsZXRlIHRoaXNbYV0pfWZ1bmN0aW9uIHUoKXt2YXIgdT1sKHQsY2EoYXJndW1lbnRzKSk7ci5jYWxsKHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihuLHRoaXNbYV09dSx1LiQ9ZSksdS5fPXR9ZnVuY3Rpb24gaSgpe3ZhciB0LGU9bmV3IFJlZ0V4cCgiXl9fb24oW14uXSspIitvYS5yZXF1b3RlKG4pKyIkIik7Zm9yKHZhciByIGluIHRoaXMpaWYodD1yLm1hdGNoKGUpKXt2YXIgdT10aGlzW3JdO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0WzFdLHUsdS4kKSxkZWxldGUgdGhpc1tyXX19dmFyIGE9Il9fb24iK24sbz1uLmluZGV4T2YoIi4iKSxsPSQ7bz4wJiYobj1uLnNsaWNlKDAsbykpO3ZhciBjPUxhLmdldChuKTtyZXR1cm4gYyYmKG49YyxsPUIpLG8/dD91OnI6dD9iOml9ZnVuY3Rpb24gJChuLHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1vYS5ldmVudDtvYS5ldmVudD1lLHRbMF09dGhpcy5fX2RhdGFfXzt0cnl7bi5hcHBseSh0aGlzLHQpfWZpbmFsbHl7b2EuZXZlbnQ9cn19fWZ1bmN0aW9uIEIobix0KXt2YXIgZT0kKG4sdCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMscj1uLnJlbGF0ZWRUYXJnZXQ7ciYmKHI9PT10fHw4JnIuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkpfHxlLmNhbGwodCxuKX19ZnVuY3Rpb24gVyhlKXt2YXIgcj0iLmRyYWdzdXBwcmVzcy0iKyArK1RhLHU9ImNsaWNrIityLGk9b2Euc2VsZWN0KHQoZSkpLm9uKCJ0b3VjaG1vdmUiK3IsUykub24oImRyYWdzdGFydCIrcixTKS5vbigic2VsZWN0c3RhcnQiK3IsUyk7aWYobnVsbD09cWEmJihxYT0ib25zZWxlY3RzdGFydCJpbiBlPyExOngoZS5zdHlsZSwidXNlclNlbGVjdCIpKSxxYSl7dmFyIGE9bihlKS5zdHlsZSxvPWFbcWFdO2FbcWFdPSJub25lIn1yZXR1cm4gZnVuY3Rpb24obil7aWYoaS5vbihyLG51bGwpLHFhJiYoYVtxYV09byksbil7dmFyIHQ9ZnVuY3Rpb24oKXtpLm9uKHUsbnVsbCl9O2kub24odSxmdW5jdGlvbigpe1MoKSx0KCl9LCEwKSxzZXRUaW1lb3V0KHQsMCl9fX1mdW5jdGlvbiBKKG4sZSl7ZS5jaGFuZ2VkVG91Y2hlcyYmKGU9ZS5jaGFuZ2VkVG91Y2hlc1swXSk7dmFyIHI9bi5vd25lclNWR0VsZW1lbnR8fG47aWYoci5jcmVhdGVTVkdQb2ludCl7dmFyIHU9ci5jcmVhdGVTVkdQb2ludCgpO2lmKDA+UmEpe3ZhciBpPXQobik7aWYoaS5zY3JvbGxYfHxpLnNjcm9sbFkpe3I9b2Euc2VsZWN0KCJib2R5IikuYXBwZW5kKCJzdmciKS5zdHlsZSh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAscGFkZGluZzowLGJvcmRlcjoibm9uZSJ9LCJpbXBvcnRhbnQiKTt2YXIgYT1yWzBdWzBdLmdldFNjcmVlbkNUTSgpO1JhPSEoYS5mfHxhLmUpLHIucmVtb3ZlKCl9fXJldHVybiBSYT8odS54PWUucGFnZVgsdS55PWUucGFnZVkpOih1Lng9ZS5jbGllbnRYLHUueT1lLmNsaWVudFkpLHU9dS5tYXRyaXhUcmFuc2Zvcm0obi5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpLFt1LngsdS55XX12YXIgbz1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltlLmNsaWVudFgtby5sZWZ0LW4uY2xpZW50TGVmdCxlLmNsaWVudFktby50b3Atbi5jbGllbnRUb3BdfWZ1bmN0aW9uIEcoKXtyZXR1cm4gb2EuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcn1mdW5jdGlvbiBLKG4pe3JldHVybiBuPjA/MTowPm4/LTE6MH1mdW5jdGlvbiBRKG4sdCxlKXtyZXR1cm4odFswXS1uWzBdKSooZVsxXS1uWzFdKS0odFsxXS1uWzFdKSooZVswXS1uWzBdKX1mdW5jdGlvbiBubihuKXtyZXR1cm4gbj4xPzA6LTE+bj9VYTpNYXRoLmFjb3Mobil9ZnVuY3Rpb24gdG4obil7cmV0dXJuIG4+MT9IYTotMT5uPy1IYTpNYXRoLmFzaW4obil9ZnVuY3Rpb24gZW4obil7cmV0dXJuKChuPU1hdGguZXhwKG4pKS0xL24pLzJ9ZnVuY3Rpb24gcm4obil7cmV0dXJuKChuPU1hdGguZXhwKG4pKSsxL24pLzJ9ZnVuY3Rpb24gdW4obil7cmV0dXJuKChuPU1hdGguZXhwKDIqbikpLTEpLyhuKzEpfWZ1bmN0aW9uIGFuKG4pe3JldHVybihuPU1hdGguc2luKG4vMikpKm59ZnVuY3Rpb24gb24oKXt9ZnVuY3Rpb24gbG4obix0LGUpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgbG4/KHRoaXMuaD0rbix0aGlzLnM9K3Qsdm9pZCh0aGlzLmw9K2UpKTphcmd1bWVudHMubGVuZ3RoPDI/biBpbnN0YW5jZW9mIGxuP25ldyBsbihuLmgsbi5zLG4ubCk6X24oIiIrbix3bixsbik6bmV3IGxuKG4sdCxlKX1mdW5jdGlvbiBjbihuLHQsZSl7ZnVuY3Rpb24gcihuKXtyZXR1cm4gbj4zNjA/bi09MzYwOjA+biYmKG4rPTM2MCksNjA+bj9pKyhhLWkpKm4vNjA6MTgwPm4/YToyNDA+bj9pKyhhLWkpKigyNDAtbikvNjA6aX1mdW5jdGlvbiB1KG4pe3JldHVybiBNYXRoLnJvdW5kKDI1NSpyKG4pKX12YXIgaSxhO3JldHVybiBuPWlzTmFOKG4pPzA6KG4lPTM2MCk8MD9uKzM2MDpuLHQ9aXNOYU4odCk/MDowPnQ/MDp0PjE/MTp0LGU9MD5lPzA6ZT4xPzE6ZSxhPS41Pj1lP2UqKDErdCk6ZSt0LWUqdCxpPTIqZS1hLG5ldyB5bih1KG4rMTIwKSx1KG4pLHUobi0xMjApKX1mdW5jdGlvbiBzbihuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBzbj8odGhpcy5oPStuLHRoaXMuYz0rdCx2b2lkKHRoaXMubD0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2Ygc24/bmV3IHNuKG4uaCxuLmMsbi5sKTpuIGluc3RhbmNlb2YgaG4/cG4obi5sLG4uYSxuLmIpOnBuKChuPVNuKChuPW9hLnJnYihuKSkucixuLmcsbi5iKSkubCxuLmEsbi5iKTpuZXcgc24obix0LGUpfWZ1bmN0aW9uIGZuKG4sdCxlKXtyZXR1cm4gaXNOYU4obikmJihuPTApLGlzTmFOKHQpJiYodD0wKSxuZXcgaG4oZSxNYXRoLmNvcyhuKj1PYSkqdCxNYXRoLnNpbihuKSp0KX1mdW5jdGlvbiBobihuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBobj8odGhpcy5sPStuLHRoaXMuYT0rdCx2b2lkKHRoaXMuYj0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgaG4/bmV3IGhuKG4ubCxuLmEsbi5iKTpuIGluc3RhbmNlb2Ygc24/Zm4obi5oLG4uYyxuLmwpOlNuKChuPXluKG4pKS5yLG4uZyxuLmIpOm5ldyBobihuLHQsZSl9ZnVuY3Rpb24gZ24obix0LGUpe3ZhciByPShuKzE2KS8xMTYsdT1yK3QvNTAwLGk9ci1lLzIwMDtyZXR1cm4gdT12bih1KSpLYSxyPXZuKHIpKlFhLGk9dm4oaSkqbm8sbmV3IHluKG1uKDMuMjQwNDU0Mip1LTEuNTM3MTM4NSpyLS40OTg1MzE0KmkpLG1uKC0uOTY5MjY2KnUrMS44NzYwMTA4KnIrLjA0MTU1NippKSxtbiguMDU1NjQzNCp1LS4yMDQwMjU5KnIrMS4wNTcyMjUyKmkpKX1mdW5jdGlvbiBwbihuLHQsZSl7cmV0dXJuIG4+MD9uZXcgc24oTWF0aC5hdGFuMihlLHQpKklhLE1hdGguc3FydCh0KnQrZSplKSxuKTpuZXcgc24oTmFOLE5hTixuKX1mdW5jdGlvbiB2bihuKXtyZXR1cm4gbj4uMjA2ODkzMDM0P24qbipuOihuLTQvMjkpLzcuNzg3MDM3fWZ1bmN0aW9uIGRuKG4pe3JldHVybiBuPi4wMDg4NTY/TWF0aC5wb3cobiwxLzMpOjcuNzg3MDM3Km4rNC8yOX1mdW5jdGlvbiBtbihuKXtyZXR1cm4gTWF0aC5yb3VuZCgyNTUqKC4wMDMwND49bj8xMi45MipuOjEuMDU1Kk1hdGgucG93KG4sMS8yLjQpLS4wNTUpKX1mdW5jdGlvbiB5bihuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiB5bj8odGhpcy5yPX5+bix0aGlzLmc9fn50LHZvaWQodGhpcy5iPX5+ZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgeW4/bmV3IHluKG4ucixuLmcsbi5iKTpfbigiIituLHluLGNuKTpuZXcgeW4obix0LGUpfWZ1bmN0aW9uIE1uKG4pe3JldHVybiBuZXcgeW4obj4+MTYsbj4+OCYyNTUsMjU1Jm4pfWZ1bmN0aW9uIHhuKG4pe3JldHVybiBNbihuKSsiIn1mdW5jdGlvbiBibihuKXtyZXR1cm4gMTY+bj8iMCIrTWF0aC5tYXgoMCxuKS50b1N0cmluZygxNik6TWF0aC5taW4oMjU1LG4pLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBfbihuLHQsZSl7dmFyIHIsdSxpLGE9MCxvPTAsbD0wO2lmKHI9LyhbYS16XSspXCgoLiopXCkvLmV4ZWMobj1uLnRvTG93ZXJDYXNlKCkpKXN3aXRjaCh1PXJbMl0uc3BsaXQoIiwiKSxyWzFdKXtjYXNlImhzbCI6cmV0dXJuIGUocGFyc2VGbG9hdCh1WzBdKSxwYXJzZUZsb2F0KHVbMV0pLzEwMCxwYXJzZUZsb2F0KHVbMl0pLzEwMCk7Y2FzZSJyZ2IiOnJldHVybiB0KE5uKHVbMF0pLE5uKHVbMV0pLE5uKHVbMl0pKX1yZXR1cm4oaT1yby5nZXQobikpP3QoaS5yLGkuZyxpLmIpOihudWxsPT1ufHwiIyIhPT1uLmNoYXJBdCgwKXx8aXNOYU4oaT1wYXJzZUludChuLnNsaWNlKDEpLDE2KSl8fCg0PT09bi5sZW5ndGg/KGE9KDM4NDAmaSk+PjQsYT1hPj40fGEsbz0yNDAmaSxvPW8+PjR8byxsPTE1JmksbD1sPDw0fGwpOjc9PT1uLmxlbmd0aCYmKGE9KDE2NzExNjgwJmkpPj4xNixvPSg2NTI4MCZpKT4+OCxsPTI1NSZpKSksdChhLG8sbCkpfWZ1bmN0aW9uIHduKG4sdCxlKXt2YXIgcix1LGk9TWF0aC5taW4obi89MjU1LHQvPTI1NSxlLz0yNTUpLGE9TWF0aC5tYXgobix0LGUpLG89YS1pLGw9KGEraSkvMjtyZXR1cm4gbz8odT0uNT5sP28vKGEraSk6by8oMi1hLWkpLHI9bj09YT8odC1lKS9vKyhlPnQ/NjowKTp0PT1hPyhlLW4pL28rMjoobi10KS9vKzQscio9NjApOihyPU5hTix1PWw+MCYmMT5sPzA6ciksbmV3IGxuKHIsdSxsKX1mdW5jdGlvbiBTbihuLHQsZSl7bj1rbihuKSx0PWtuKHQpLGU9a24oZSk7dmFyIHI9ZG4oKC40MTI0NTY0Km4rLjM1NzU3NjEqdCsuMTgwNDM3NSplKS9LYSksdT1kbigoLjIxMjY3MjkqbisuNzE1MTUyMip0Ky4wNzIxNzUqZSkvUWEpLGk9ZG4oKC4wMTkzMzM5Km4rLjExOTE5Mip0Ky45NTAzMDQxKmUpL25vKTtyZXR1cm4gaG4oMTE2KnUtMTYsNTAwKihyLXUpLDIwMCoodS1pKSl9ZnVuY3Rpb24ga24obil7cmV0dXJuKG4vPTI1NSk8PS4wNDA0NT9uLzEyLjkyOk1hdGgucG93KChuKy4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gTm4obil7dmFyIHQ9cGFyc2VGbG9hdChuKTtyZXR1cm4iJSI9PT1uLmNoYXJBdChuLmxlbmd0aC0xKT9NYXRoLnJvdW5kKDIuNTUqdCk6dH1mdW5jdGlvbiBFbihuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmZ1bmN0aW9uKCl7cmV0dXJuIG59fWZ1bmN0aW9uIEFuKG4pe3JldHVybiBmdW5jdGlvbih0LGUscil7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLENuKHQsZSxuLHIpfX1mdW5jdGlvbiBDbihuLHQsZSxyKXtmdW5jdGlvbiB1KCl7dmFyIG4sdD1sLnN0YXR1cztpZighdCYmTG4obCl8fHQ+PTIwMCYmMzAwPnR8fDMwND09PXQpe3RyeXtuPWUuY2FsbChpLGwpfWNhdGNoKHIpe3JldHVybiB2b2lkIGEuZXJyb3IuY2FsbChpLHIpfWEubG9hZC5jYWxsKGksbil9ZWxzZSBhLmVycm9yLmNhbGwoaSxsKX12YXIgaT17fSxhPW9hLmRpc3BhdGNoKCJiZWZvcmVzZW5kIiwicHJvZ3Jlc3MiLCJsb2FkIiwiZXJyb3IiKSxvPXt9LGw9bmV3IFhNTEh0dHBSZXF1ZXN0LGM9bnVsbDtyZXR1cm4hdGhpcy5YRG9tYWluUmVxdWVzdHx8IndpdGhDcmVkZW50aWFscyJpbiBsfHwhL14oaHR0cChzKT86KT9cL1wvLy50ZXN0KG4pfHwobD1uZXcgWERvbWFpblJlcXVlc3QpLCJvbmxvYWQiaW4gbD9sLm9ubG9hZD1sLm9uZXJyb3I9dTpsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2wucmVhZHlTdGF0ZT4zJiZ1KCl9LGwub25wcm9ncmVzcz1mdW5jdGlvbihuKXt2YXIgdD1vYS5ldmVudDtvYS5ldmVudD1uO3RyeXthLnByb2dyZXNzLmNhbGwoaSxsKX1maW5hbGx5e29hLmV2ZW50PXR9fSxpLmhlYWRlcj1mdW5jdGlvbihuLHQpe3JldHVybiBuPShuKyIiKS50b0xvd2VyQ2FzZSgpLGFyZ3VtZW50cy5sZW5ndGg8Mj9vW25dOihudWxsPT10P2RlbGV0ZSBvW25dOm9bbl09dCsiIixpKX0saS5taW1lVHlwZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1udWxsPT1uP251bGw6bisiIixpKTp0fSxpLnJlc3BvbnNlVHlwZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uLGkpOmN9LGkucmVzcG9uc2U9ZnVuY3Rpb24obil7cmV0dXJuIGU9bixpfSxbImdldCIsInBvc3QiXS5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lbbl09ZnVuY3Rpb24oKXtyZXR1cm4gaS5zZW5kLmFwcGx5KGksW25dLmNvbmNhdChjYShhcmd1bWVudHMpKSl9fSksaS5zZW5kPWZ1bmN0aW9uKGUscix1KXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIHImJih1PXIscj1udWxsKSxsLm9wZW4oZSxuLCEwKSxudWxsPT10fHwiYWNjZXB0ImluIG98fChvLmFjY2VwdD10KyIsKi8qIiksbC5zZXRSZXF1ZXN0SGVhZGVyKWZvcih2YXIgcyBpbiBvKWwuc2V0UmVxdWVzdEhlYWRlcihzLG9bc10pO3JldHVybiBudWxsIT10JiZsLm92ZXJyaWRlTWltZVR5cGUmJmwub3ZlcnJpZGVNaW1lVHlwZSh0KSxudWxsIT1jJiYobC5yZXNwb25zZVR5cGU9YyksbnVsbCE9dSYmaS5vbigiZXJyb3IiLHUpLm9uKCJsb2FkIixmdW5jdGlvbihuKXt1KG51bGwsbil9KSxhLmJlZm9yZXNlbmQuY2FsbChpLGwpLGwuc2VuZChudWxsPT1yP251bGw6ciksaX0saS5hYm9ydD1mdW5jdGlvbigpe3JldHVybiBsLmFib3J0KCksaX0sb2EucmViaW5kKGksYSwib24iKSxudWxsPT1yP2k6aS5nZXQoem4ocikpfWZ1bmN0aW9uIHpuKG4pe3JldHVybiAxPT09bi5sZW5ndGg/ZnVuY3Rpb24odCxlKXtuKG51bGw9PXQ/ZTpudWxsKX06bn1mdW5jdGlvbiBMbihuKXt2YXIgdD1uLnJlc3BvbnNlVHlwZTtyZXR1cm4gdCYmInRleHQiIT09dD9uLnJlc3BvbnNlOm4ucmVzcG9uc2VUZXh0fWZ1bmN0aW9uIHFuKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoOzI+ciYmKHQ9MCksMz5yJiYoZT1EYXRlLm5vdygpKTt2YXIgdT1lK3QsaT17YzpuLHQ6dSxuOm51bGx9O3JldHVybiBpbz9pby5uPWk6dW89aSxpbz1pLGFvfHwob289Y2xlYXJUaW1lb3V0KG9vKSxhbz0xLGxvKFRuKSksaX1mdW5jdGlvbiBUbigpe3ZhciBuPVJuKCksdD1EbigpLW47dD4yND8oaXNGaW5pdGUodCkmJihjbGVhclRpbWVvdXQob28pLG9vPXNldFRpbWVvdXQoVG4sdCkpLGFvPTApOihhbz0xLGxvKFRuKSl9ZnVuY3Rpb24gUm4oKXtmb3IodmFyIG49RGF0ZS5ub3coKSx0PXVvO3Q7KW4+PXQudCYmdC5jKG4tdC50KSYmKHQuYz1udWxsKSx0PXQubjtyZXR1cm4gbn1mdW5jdGlvbiBEbigpe2Zvcih2YXIgbix0PXVvLGU9MS8wO3Q7KXQuYz8odC50PGUmJihlPXQudCksdD0obj10KS5uKTp0PW4/bi5uPXQubjp1bz10Lm47cmV0dXJuIGlvPW4sZX1mdW5jdGlvbiBQbihuLHQpe3JldHVybiB0LShuP01hdGguY2VpbChNYXRoLmxvZyhuKS9NYXRoLkxOMTApOjEpfWZ1bmN0aW9uIFVuKG4sdCl7dmFyIGU9TWF0aC5wb3coMTAsMypNYSg4LXQpKTtyZXR1cm57c2NhbGU6dD44P2Z1bmN0aW9uKG4pe3JldHVybiBuL2V9OmZ1bmN0aW9uKG4pe3JldHVybiBuKmV9LHN5bWJvbDpufX1mdW5jdGlvbiBqbihuKXt2YXIgdD1uLmRlY2ltYWwsZT1uLnRob3VzYW5kcyxyPW4uZ3JvdXBpbmcsdT1uLmN1cnJlbmN5LGk9ciYmZT9mdW5jdGlvbihuLHQpe2Zvcih2YXIgdT1uLmxlbmd0aCxpPVtdLGE9MCxvPXJbMF0sbD0wO3U+MCYmbz4wJiYobCtvKzE+dCYmKG89TWF0aC5tYXgoMSx0LWwpKSxpLnB1c2gobi5zdWJzdHJpbmcodS09byx1K28pKSwhKChsKz1vKzEpPnQpKTspbz1yW2E9KGErMSklci5sZW5ndGhdO3JldHVybiBpLnJldmVyc2UoKS5qb2luKGUpfTp5O3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1zby5leGVjKG4pLHI9ZVsxXXx8IiAiLGE9ZVsyXXx8Ij4iLG89ZVszXXx8Ii0iLGw9ZVs0XXx8IiIsYz1lWzVdLHM9K2VbNl0sZj1lWzddLGg9ZVs4XSxnPWVbOV0scD0xLHY9IiIsZD0iIixtPSExLHk9ITA7c3dpdGNoKGgmJihoPStoLnN1YnN0cmluZygxKSksKGN8fCIwIj09PXImJiI9Ij09PWEpJiYoYz1yPSIwIixhPSI9IiksZyl7Y2FzZSJuIjpmPSEwLGc9ImciO2JyZWFrO2Nhc2UiJSI6cD0xMDAsZD0iJSIsZz0iZiI7YnJlYWs7Y2FzZSJwIjpwPTEwMCxkPSIlIixnPSJyIjticmVhaztjYXNlImIiOmNhc2UibyI6Y2FzZSJ4IjpjYXNlIlgiOiIjIj09PWwmJih2PSIwIitnLnRvTG93ZXJDYXNlKCkpO2Nhc2UiYyI6eT0hMTtjYXNlImQiOm09ITAsaD0wO2JyZWFrO2Nhc2UicyI6cD0tMSxnPSJyIn0iJCI9PT1sJiYodj11WzBdLGQ9dVsxXSksInIiIT1nfHxofHwoZz0iZyIpLG51bGwhPWgmJigiZyI9PWc/aD1NYXRoLm1heCgxLE1hdGgubWluKDIxLGgpKTooImUiPT1nfHwiZiI9PWcpJiYoaD1NYXRoLm1heCgwLE1hdGgubWluKDIwLGgpKSkpLGc9Zm8uZ2V0KGcpfHxGbjt2YXIgTT1jJiZmO3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1kO2lmKG0mJm4lMSlyZXR1cm4iIjt2YXIgdT0wPm58fDA9PT1uJiYwPjEvbj8obj0tbiwiLSIpOiItIj09PW8/IiI6bztpZigwPnApe3ZhciBsPW9hLmZvcm1hdFByZWZpeChuLGgpO249bC5zY2FsZShuKSxlPWwuc3ltYm9sK2R9ZWxzZSBuKj1wO249ZyhuLGgpO3ZhciB4LGIsXz1uLmxhc3RJbmRleE9mKCIuIik7aWYoMD5fKXt2YXIgdz15P24ubGFzdEluZGV4T2YoImUiKTotMTswPnc/KHg9bixiPSIiKTooeD1uLnN1YnN0cmluZygwLHcpLGI9bi5zdWJzdHJpbmcodykpfWVsc2UgeD1uLnN1YnN0cmluZygwLF8pLGI9dCtuLnN1YnN0cmluZyhfKzEpOyFjJiZmJiYoeD1pKHgsMS8wKSk7dmFyIFM9di5sZW5ndGgreC5sZW5ndGgrYi5sZW5ndGgrKE0/MDp1Lmxlbmd0aCksaz1zPlM/bmV3IEFycmF5KFM9cy1TKzEpLmpvaW4ocik6IiI7cmV0dXJuIE0mJih4PWkoayt4LGsubGVuZ3RoP3MtYi5sZW5ndGg6MS8wKSksdSs9dixuPXgrYiwoIjwiPT09YT91K24razoiPiI9PT1hP2srdStuOiJeIj09PWE/ay5zdWJzdHJpbmcoMCxTPj49MSkrdStuK2suc3Vic3RyaW5nKFMpOnUrKE0/bjprK24pKStlfX19ZnVuY3Rpb24gRm4obil7cmV0dXJuIG4rIiJ9ZnVuY3Rpb24gSG4oKXt0aGlzLl89bmV3IERhdGUoYXJndW1lbnRzLmxlbmd0aD4xP0RhdGUuVVRDLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHNbMF0pfWZ1bmN0aW9uIE9uKG4sdCxlKXtmdW5jdGlvbiByKHQpe3ZhciBlPW4odCkscj1pKGUsMSk7cmV0dXJuIHItdD50LWU/ZTpyfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIHQoZT1uKG5ldyBnbyhlLTEpKSwxKSxlfWZ1bmN0aW9uIGkobixlKXtyZXR1cm4gdChuPW5ldyBnbygrbiksZSksbn1mdW5jdGlvbiBhKG4scixpKXt2YXIgYT11KG4pLG89W107aWYoaT4xKWZvcig7cj5hOyllKGEpJWl8fG8ucHVzaChuZXcgRGF0ZSgrYSkpLHQoYSwxKTtlbHNlIGZvcig7cj5hOylvLnB1c2gobmV3IERhdGUoK2EpKSx0KGEsMSk7cmV0dXJuIG99ZnVuY3Rpb24gbyhuLHQsZSl7dHJ5e2dvPUhuO3ZhciByPW5ldyBIbjtyZXR1cm4gci5fPW4sYShyLHQsZSl9ZmluYWxseXtnbz1EYXRlfX1uLmZsb29yPW4sbi5yb3VuZD1yLG4uY2VpbD11LG4ub2Zmc2V0PWksbi5yYW5nZT1hO3ZhciBsPW4udXRjPUluKG4pO3JldHVybiBsLmZsb29yPWwsbC5yb3VuZD1JbihyKSxsLmNlaWw9SW4odSksbC5vZmZzZXQ9SW4oaSksbC5yYW5nZT1vLG59ZnVuY3Rpb24gSW4obil7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dHJ5e2dvPUhuO3ZhciByPW5ldyBIbjtyZXR1cm4gci5fPXQsbihyLGUpLl99ZmluYWxseXtnbz1EYXRlfX19ZnVuY3Rpb24gWW4obil7ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiB0KHQpe2Zvcih2YXIgZSx1LGksYT1bXSxvPS0xLGw9MDsrK288cjspMzc9PT1uLmNoYXJDb2RlQXQobykmJihhLnB1c2gobi5zbGljZShsLG8pKSxudWxsIT0odT12b1tlPW4uY2hhckF0KCsrbyldKSYmKGU9bi5jaGFyQXQoKytvKSksKGk9QVtlXSkmJihlPWkodCxudWxsPT11PyJlIj09PWU/IiAiOiIwIjp1KSksYS5wdXNoKGUpLGw9bysxKTtyZXR1cm4gYS5wdXNoKG4uc2xpY2UobCxvKSksYS5qb2luKCIiKX12YXIgcj1uLmxlbmd0aDtyZXR1cm4gdC5wYXJzZT1mdW5jdGlvbih0KXt2YXIgcj17eToxOTAwLG06MCxkOjEsSDowLE06MCxTOjAsTDowLFo6bnVsbH0sdT1lKHIsbix0LDApO2lmKHUhPXQubGVuZ3RoKXJldHVybiBudWxsOyJwImluIHImJihyLkg9ci5IJTEyKzEyKnIucCk7dmFyIGk9bnVsbCE9ci5aJiZnbyE9PUhuLGE9bmV3KGk/SG46Z28pO3JldHVybiJqImluIHI/YS5zZXRGdWxsWWVhcihyLnksMCxyLmopOiJXImluIHJ8fCJVImluIHI/KCJ3ImluIHJ8fChyLnc9IlciaW4gcj8xOjApLGEuc2V0RnVsbFllYXIoci55LDAsMSksYS5zZXRGdWxsWWVhcihyLnksMCwiVyJpbiByPyhyLncrNiklNys3KnIuVy0oYS5nZXREYXkoKSs1KSU3OnIudys3KnIuVS0oYS5nZXREYXkoKSs2KSU3KSk6YS5zZXRGdWxsWWVhcihyLnksci5tLHIuZCksYS5zZXRIb3VycyhyLkgrKHIuWi8xMDB8MCksci5NK3IuWiUxMDAsci5TLHIuTCksaT9hLl86YX0sdC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBufSx0fWZ1bmN0aW9uIGUobix0LGUscil7Zm9yKHZhciB1LGksYSxvPTAsbD10Lmxlbmd0aCxjPWUubGVuZ3RoO2w+bzspe2lmKHI+PWMpcmV0dXJuLTE7aWYodT10LmNoYXJDb2RlQXQobysrKSwzNz09PXUpe2lmKGE9dC5jaGFyQXQobysrKSxpPUNbYSBpbiB2bz90LmNoYXJBdChvKyspOmFdLCFpfHwocj1pKG4sZSxyKSk8MClyZXR1cm4tMX1lbHNlIGlmKHUhPWUuY2hhckNvZGVBdChyKyspKXJldHVybi0xfXJldHVybiByfWZ1bmN0aW9uIHIobix0LGUpe18ubGFzdEluZGV4PTA7dmFyIHI9Xy5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLnc9dy5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1KG4sdCxlKXt4Lmxhc3RJbmRleD0wO3ZhciByPXguZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi53PWIuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gaShuLHQsZSl7Ti5sYXN0SW5kZXg9MDt2YXIgcj1OLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4ubT1FLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGEobix0LGUpe1MubGFzdEluZGV4PTA7dmFyIHI9Uy5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLm09ay5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBvKG4sdCxyKXtyZXR1cm4gZShuLEEuYy50b1N0cmluZygpLHQscil9ZnVuY3Rpb24gbChuLHQscil7cmV0dXJuIGUobixBLngudG9TdHJpbmcoKSx0LHIpfWZ1bmN0aW9uIGMobix0LHIpe3JldHVybiBlKG4sQS5YLnRvU3RyaW5nKCksdCxyKX1mdW5jdGlvbiBzKG4sdCxlKXt2YXIgcj1NLmdldCh0LnNsaWNlKGUsZSs9MikudG9Mb3dlckNhc2UoKSk7cmV0dXJuIG51bGw9PXI/LTE6KG4ucD1yLGUpfXZhciBmPW4uZGF0ZVRpbWUsaD1uLmRhdGUsZz1uLnRpbWUscD1uLnBlcmlvZHMsdj1uLmRheXMsZD1uLnNob3J0RGF5cyxtPW4ubW9udGhzLHk9bi5zaG9ydE1vbnRoczt0LnV0Yz1mdW5jdGlvbihuKXtmdW5jdGlvbiBlKG4pe3RyeXtnbz1Ibjt2YXIgdD1uZXcgZ287cmV0dXJuIHQuXz1uLHIodCl9ZmluYWxseXtnbz1EYXRlfX12YXIgcj10KG4pO3JldHVybiBlLnBhcnNlPWZ1bmN0aW9uKG4pe3RyeXtnbz1Ibjt2YXIgdD1yLnBhcnNlKG4pO3JldHVybiB0JiZ0Ll99ZmluYWxseXtnbz1EYXRlfX0sZS50b1N0cmluZz1yLnRvU3RyaW5nLGV9LHQubXVsdGk9dC51dGMubXVsdGk9Y3Q7dmFyIE09b2EubWFwKCkseD1Wbih2KSxiPVhuKHYpLF89Vm4oZCksdz1YbihkKSxTPVZuKG0pLGs9WG4obSksTj1Wbih5KSxFPVhuKHkpO3AuZm9yRWFjaChmdW5jdGlvbihuLHQpe00uc2V0KG4udG9Mb3dlckNhc2UoKSx0KX0pO3ZhciBBPXthOmZ1bmN0aW9uKG4pe3JldHVybiBkW24uZ2V0RGF5KCldfSxBOmZ1bmN0aW9uKG4pe3JldHVybiB2W24uZ2V0RGF5KCldfSxiOmZ1bmN0aW9uKG4pe3JldHVybiB5W24uZ2V0TW9udGgoKV19LEI6ZnVuY3Rpb24obil7cmV0dXJuIG1bbi5nZXRNb250aCgpXX0sYzp0KGYpLGQ6ZnVuY3Rpb24obix0KXtyZXR1cm4gWm4obi5nZXREYXRlKCksdCwyKX0sZTpmdW5jdGlvbihuLHQpe3JldHVybiBabihuLmdldERhdGUoKSx0LDIpfSxIOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFpuKG4uZ2V0SG91cnMoKSx0LDIpfSxJOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFpuKG4uZ2V0SG91cnMoKSUxMnx8MTIsdCwyKX0sajpmdW5jdGlvbihuLHQpe3JldHVybiBabigxK2hvLmRheU9mWWVhcihuKSx0LDMpfSxMOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFpuKG4uZ2V0TWlsbGlzZWNvbmRzKCksdCwzKX0sbTpmdW5jdGlvbihuLHQpe3JldHVybiBabihuLmdldE1vbnRoKCkrMSx0LDIpfSxNOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFpuKG4uZ2V0TWludXRlcygpLHQsMil9LHA6ZnVuY3Rpb24obil7cmV0dXJuIHBbKyhuLmdldEhvdXJzKCk+PTEyKV19LFM6ZnVuY3Rpb24obix0KXtyZXR1cm4gWm4obi5nZXRTZWNvbmRzKCksdCwyKX0sVTpmdW5jdGlvbihuLHQpe3JldHVybiBabihoby5zdW5kYXlPZlllYXIobiksdCwyKX0sdzpmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXREYXkoKX0sVzpmdW5jdGlvbihuLHQpe3JldHVybiBabihoby5tb25kYXlPZlllYXIobiksdCwyKX0seDp0KGgpLFg6dChnKSx5OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFpuKG4uZ2V0RnVsbFllYXIoKSUxMDAsdCwyKX0sWTpmdW5jdGlvbihuLHQpe3JldHVybiBabihuLmdldEZ1bGxZZWFyKCklMWU0LHQsNCl9LFo6b3QsIiUiOmZ1bmN0aW9uKCl7cmV0dXJuIiUifX0sQz17YTpyLEE6dSxiOmksQjphLGM6byxkOnR0LGU6dHQsSDpydCxJOnJ0LGo6ZXQsTDphdCxtOm50LE06dXQscDpzLFM6aXQsVTpCbix3OiRuLFc6V24seDpsLFg6Yyx5OkduLFk6Sm4sWjpLbiwiJSI6bHR9O3JldHVybiB0fWZ1bmN0aW9uIFpuKG4sdCxlKXt2YXIgcj0wPm4/Ii0iOiIiLHU9KHI/LW46bikrIiIsaT11Lmxlbmd0aDtyZXR1cm4gcisoZT5pP25ldyBBcnJheShlLWkrMSkuam9pbih0KSt1OnUpfWZ1bmN0aW9uIFZuKG4pe3JldHVybiBuZXcgUmVnRXhwKCJeKD86IituLm1hcChvYS5yZXF1b3RlKS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gWG4obil7Zm9yKHZhciB0PW5ldyBjLGU9LTEscj1uLmxlbmd0aDsrK2U8cjspdC5zZXQobltlXS50b0xvd2VyQ2FzZSgpLGUpO3JldHVybiB0fWZ1bmN0aW9uICRuKG4sdCxlKXttby5sYXN0SW5kZXg9MDt2YXIgcj1tby5leGVjKHQuc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj8obi53PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEJuKG4sdCxlKXttby5sYXN0SW5kZXg9MDt2YXIgcj1tby5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLlU9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gV24obix0LGUpe21vLmxhc3RJbmRleD0wO3ZhciByPW1vLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4uVz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKbihuLHQsZSl7bW8ubGFzdEluZGV4PTA7dmFyIHI9bW8uZXhlYyh0LnNsaWNlKGUsZSs0KSk7cmV0dXJuIHI/KG4ueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBHbihuLHQsZSl7bW8ubGFzdEluZGV4PTA7dmFyIHI9bW8uZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4ueT1RbigrclswXSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gS24obix0LGUpe3JldHVybi9eWystXVxkezR9JC8udGVzdCh0PXQuc2xpY2UoZSxlKzUpKT8obi5aPS10LGUrNSk6LTF9ZnVuY3Rpb24gUW4obil7cmV0dXJuIG4rKG4+Njg/MTkwMDoyZTMpfWZ1bmN0aW9uIG50KG4sdCxlKXttby5sYXN0SW5kZXg9MDt2YXIgcj1tby5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5tPXJbMF0tMSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB0dChuLHQsZSl7bW8ubGFzdEluZGV4PTA7dmFyIHI9bW8uZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uZD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBldChuLHQsZSl7bW8ubGFzdEluZGV4PTA7dmFyIHI9bW8uZXhlYyh0LnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KG4uaj0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBydChuLHQsZSl7bW8ubGFzdEluZGV4PTA7dmFyIHI9bW8uZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uSD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1dChuLHQsZSl7bW8ubGFzdEluZGV4PTA7dmFyIHI9bW8uZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uTT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpdChuLHQsZSl7bW8ubGFzdEluZGV4PTA7dmFyIHI9bW8uZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uUz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBhdChuLHQsZSl7bW8ubGFzdEluZGV4PTA7dmFyIHI9bW8uZXhlYyh0LnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KG4uTD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBvdChuKXt2YXIgdD1uLmdldFRpbWV6b25lT2Zmc2V0KCksZT10PjA/Ii0iOiIrIixyPU1hKHQpLzYwfDAsdT1NYSh0KSU2MDtyZXR1cm4gZStabihyLCIwIiwyKStabih1LCIwIiwyKX1mdW5jdGlvbiBsdChuLHQsZSl7eW8ubGFzdEluZGV4PTA7dmFyIHI9eW8uZXhlYyh0LnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/ZStyWzBdLmxlbmd0aDotMX1mdW5jdGlvbiBjdChuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT0tMTsrK2U8dDspbltlXVswXT10aGlzKG5bZV1bMF0pO3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxyPW5bZV07IXJbMV0odCk7KXI9blsrK2VdO3JldHVybiByWzBdKHQpfX1mdW5jdGlvbiBzdCgpe31mdW5jdGlvbiBmdChuLHQsZSl7dmFyIHI9ZS5zPW4rdCx1PXItbixpPXItdTtlLnQ9bi1pKyh0LXUpfWZ1bmN0aW9uIGh0KG4sdCl7biYmX28uaGFzT3duUHJvcGVydHkobi50eXBlKSYmX29bbi50eXBlXShuLHQpfWZ1bmN0aW9uIGd0KG4sdCxlKXt2YXIgcix1PS0xLGk9bi5sZW5ndGgtZTtmb3IodC5saW5lU3RhcnQoKTsrK3U8aTspcj1uW3VdLHQucG9pbnQoclswXSxyWzFdLHJbMl0pO3QubGluZUVuZCgpfWZ1bmN0aW9uIHB0KG4sdCl7dmFyIGU9LTEscj1uLmxlbmd0aDtmb3IodC5wb2x5Z29uU3RhcnQoKTsrK2U8cjspZ3QobltlXSx0LDEpO3QucG9seWdvbkVuZCgpfWZ1bmN0aW9uIHZ0KCl7ZnVuY3Rpb24gbihuLHQpe24qPU9hLHQ9dCpPYS8yK1VhLzQ7dmFyIGU9bi1yLGE9ZT49MD8xOi0xLG89YSplLGw9TWF0aC5jb3ModCksYz1NYXRoLnNpbih0KSxzPWkqYyxmPXUqbCtzKk1hdGguY29zKG8pLGg9cyphKk1hdGguc2luKG8pO1NvLmFkZChNYXRoLmF0YW4yKGgsZikpLHI9bix1PWwsaT1jfXZhciB0LGUscix1LGk7a28ucG9pbnQ9ZnVuY3Rpb24oYSxvKXtrby5wb2ludD1uLHI9KHQ9YSkqT2EsdT1NYXRoLmNvcyhvPShlPW8pKk9hLzIrVWEvNCksaT1NYXRoLnNpbihvKX0sa28ubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gZHQobil7dmFyIHQ9blswXSxlPW5bMV0scj1NYXRoLmNvcyhlKTtyZXR1cm5bcipNYXRoLmNvcyh0KSxyKk1hdGguc2luKHQpLE1hdGguc2luKGUpXX1mdW5jdGlvbiBtdChuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdK25bMl0qdFsyXX1mdW5jdGlvbiB5dChuLHQpe3JldHVybltuWzFdKnRbMl0tblsyXSp0WzFdLG5bMl0qdFswXS1uWzBdKnRbMl0sblswXSp0WzFdLW5bMV0qdFswXV19ZnVuY3Rpb24gTXQobix0KXtuWzBdKz10WzBdLG5bMV0rPXRbMV0sblsyXSs9dFsyXX1mdW5jdGlvbiB4dChuLHQpe3JldHVybltuWzBdKnQsblsxXSp0LG5bMl0qdF19ZnVuY3Rpb24gYnQobil7dmFyIHQ9TWF0aC5zcXJ0KG5bMF0qblswXStuWzFdKm5bMV0rblsyXSpuWzJdKTtuWzBdLz10LG5bMV0vPXQsblsyXS89dH1mdW5jdGlvbiBfdChuKXtyZXR1cm5bTWF0aC5hdGFuMihuWzFdLG5bMF0pLHRuKG5bMl0pXX1mdW5jdGlvbiB3dChuLHQpe3JldHVybiBNYShuWzBdLXRbMF0pPERhJiZNYShuWzFdLXRbMV0pPERhfWZ1bmN0aW9uIFN0KG4sdCl7bio9T2E7dmFyIGU9TWF0aC5jb3ModCo9T2EpO2t0KGUqTWF0aC5jb3MobiksZSpNYXRoLnNpbihuKSxNYXRoLnNpbih0KSl9ZnVuY3Rpb24ga3Qobix0LGUpeysrTm8sQW8rPShuLUFvKS9ObyxDbys9KHQtQ28pL05vLHpvKz0oZS16bykvTm99ZnVuY3Rpb24gTnQoKXtmdW5jdGlvbiBuKG4sdSl7bio9T2E7dmFyIGk9TWF0aC5jb3ModSo9T2EpLGE9aSpNYXRoLmNvcyhuKSxvPWkqTWF0aC5zaW4obiksbD1NYXRoLnNpbih1KSxjPU1hdGguYXRhbjIoTWF0aC5zcXJ0KChjPWUqbC1yKm8pKmMrKGM9ciphLXQqbCkqYysoYz10Km8tZSphKSpjKSx0KmErZSpvK3IqbCk7RW8rPWMsTG8rPWMqKHQrKHQ9YSkpLHFvKz1jKihlKyhlPW8pKSxUbys9Yyoocisocj1sKSksa3QodCxlLHIpfXZhciB0LGUscjtVby5wb2ludD1mdW5jdGlvbih1LGkpe3UqPU9hO3ZhciBhPU1hdGguY29zKGkqPU9hKTt0PWEqTWF0aC5jb3ModSksZT1hKk1hdGguc2luKHUpLHI9TWF0aC5zaW4oaSksVW8ucG9pbnQ9bixrdCh0LGUscil9fWZ1bmN0aW9uIEV0KCl7VW8ucG9pbnQ9U3R9ZnVuY3Rpb24gQXQoKXtmdW5jdGlvbiBuKG4sdCl7bio9T2E7dmFyIGU9TWF0aC5jb3ModCo9T2EpLGE9ZSpNYXRoLmNvcyhuKSxvPWUqTWF0aC5zaW4obiksbD1NYXRoLnNpbih0KSxjPXUqbC1pKm8scz1pKmEtcipsLGY9cipvLXUqYSxoPU1hdGguc3FydChjKmMrcypzK2YqZiksZz1yKmErdSpvK2kqbCxwPWgmJi1ubihnKS9oLHY9TWF0aC5hdGFuMihoLGcpO1JvKz1wKmMsRG8rPXAqcyxQbys9cCpmLEVvKz12LExvKz12KihyKyhyPWEpKSxxbys9dioodSsodT1vKSksVG8rPXYqKGkrKGk9bCkpLGt0KHIsdSxpKX12YXIgdCxlLHIsdSxpO1VvLnBvaW50PWZ1bmN0aW9uKGEsbyl7dD1hLGU9byxVby5wb2ludD1uLGEqPU9hO3ZhciBsPU1hdGguY29zKG8qPU9hKTtyPWwqTWF0aC5jb3MoYSksdT1sKk1hdGguc2luKGEpLGk9TWF0aC5zaW4obyksa3Qocix1LGkpfSxVby5saW5lRW5kPWZ1bmN0aW9uKCl7bih0LGUpLFVvLmxpbmVFbmQ9RXQsVW8ucG9pbnQ9U3R9fWZ1bmN0aW9uIEN0KG4sdCl7ZnVuY3Rpb24gZShlLHIpe3JldHVybiBlPW4oZSxyKSx0KGVbMF0sZVsxXSl9cmV0dXJuIG4uaW52ZXJ0JiZ0LmludmVydCYmKGUuaW52ZXJ0PWZ1bmN0aW9uKGUscil7cmV0dXJuIGU9dC5pbnZlcnQoZSxyKSxlJiZuLmludmVydChlWzBdLGVbMV0pfSksZX1mdW5jdGlvbiB6dCgpe3JldHVybiEwfWZ1bmN0aW9uIEx0KG4sdCxlLHIsdSl7dmFyIGk9W10sYT1bXTtpZihuLmZvckVhY2goZnVuY3Rpb24obil7aWYoISgodD1uLmxlbmd0aC0xKTw9MCkpe3ZhciB0LGU9blswXSxyPW5bdF07aWYod3QoZSxyKSl7dS5saW5lU3RhcnQoKTtmb3IodmFyIG89MDt0Pm87KytvKXUucG9pbnQoKGU9bltvXSlbMF0sZVsxXSk7cmV0dXJuIHZvaWQgdS5saW5lRW5kKCl9dmFyIGw9bmV3IFR0KGUsbixudWxsLCEwKSxjPW5ldyBUdChlLG51bGwsbCwhMSk7bC5vPWMsaS5wdXNoKGwpLGEucHVzaChjKSxsPW5ldyBUdChyLG4sbnVsbCwhMSksYz1uZXcgVHQocixudWxsLGwsITApLGwubz1jLGkucHVzaChsKSxhLnB1c2goYyl9fSksYS5zb3J0KHQpLHF0KGkpLHF0KGEpLGkubGVuZ3RoKXtmb3IodmFyIG89MCxsPWUsYz1hLmxlbmd0aDtjPm87KytvKWFbb10uZT1sPSFsO2Zvcih2YXIgcyxmLGg9aVswXTs7KXtmb3IodmFyIGc9aCxwPSEwO2cudjspaWYoKGc9Zy5uKT09PWgpcmV0dXJuO3M9Zy56LHUubGluZVN0YXJ0KCk7ZG97aWYoZy52PWcuby52PSEwLGcuZSl7aWYocClmb3IodmFyIG89MCxjPXMubGVuZ3RoO2M+bzsrK28pdS5wb2ludCgoZj1zW29dKVswXSxmWzFdKTtlbHNlIHIoZy54LGcubi54LDEsdSk7Zz1nLm59ZWxzZXtpZihwKXtzPWcucC56O2Zvcih2YXIgbz1zLmxlbmd0aC0xO28+PTA7LS1vKXUucG9pbnQoKGY9c1tvXSlbMF0sZlsxXSl9ZWxzZSByKGcueCxnLnAueCwtMSx1KTtnPWcucH1nPWcubyxzPWcueixwPSFwfXdoaWxlKCFnLnYpO3UubGluZUVuZCgpfX19ZnVuY3Rpb24gcXQobil7aWYodD1uLmxlbmd0aCl7Zm9yKHZhciB0LGUscj0wLHU9blswXTsrK3I8dDspdS5uPWU9bltyXSxlLnA9dSx1PWU7dS5uPWU9blswXSxlLnA9dX19ZnVuY3Rpb24gVHQobix0LGUscil7dGhpcy54PW4sdGhpcy56PXQsdGhpcy5vPWUsdGhpcy5lPXIsdGhpcy52PSExLHRoaXMubj10aGlzLnA9bnVsbH1mdW5jdGlvbiBSdChuLHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odSxpKXtmdW5jdGlvbiBhKHQsZSl7dmFyIHI9dSh0LGUpO24odD1yWzBdLGU9clsxXSkmJmkucG9pbnQodCxlKX1mdW5jdGlvbiBvKG4sdCl7dmFyIGU9dShuLHQpO2QucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiBsKCl7eS5wb2ludD1vLGQubGluZVN0YXJ0KCl9ZnVuY3Rpb24gYygpe3kucG9pbnQ9YSxkLmxpbmVFbmQoKX1mdW5jdGlvbiBzKG4sdCl7di5wdXNoKFtuLHRdKTt2YXIgZT11KG4sdCk7eC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGYoKXt4LmxpbmVTdGFydCgpLHY9W119ZnVuY3Rpb24gaCgpe3ModlswXVswXSx2WzBdWzFdKSx4LmxpbmVFbmQoKTt2YXIgbix0PXguY2xlYW4oKSxlPU0uYnVmZmVyKCkscj1lLmxlbmd0aDtpZih2LnBvcCgpLHAucHVzaCh2KSx2PW51bGwscilpZigxJnQpe249ZVswXTt2YXIgdSxyPW4ubGVuZ3RoLTEsYT0tMTtpZihyPjApe2ZvcihifHwoaS5wb2x5Z29uU3RhcnQoKSxiPSEwKSxpLmxpbmVTdGFydCgpOysrYTxyOylpLnBvaW50KCh1PW5bYV0pWzBdLHVbMV0pO2kubGluZUVuZCgpfX1lbHNlIHI+MSYmMiZ0JiZlLnB1c2goZS5wb3AoKS5jb25jYXQoZS5zaGlmdCgpKSksZy5wdXNoKGUuZmlsdGVyKER0KSl9dmFyIGcscCx2LGQ9dChpKSxtPXUuaW52ZXJ0KHJbMF0sclsxXSkseT17cG9pbnQ6YSxsaW5lU3RhcnQ6bCxsaW5lRW5kOmMscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7eS5wb2ludD1zLHkubGluZVN0YXJ0PWYseS5saW5lRW5kPWgsZz1bXSxwPVtdfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7eS5wb2ludD1hLHkubGluZVN0YXJ0PWwseS5saW5lRW5kPWMsZz1vYS5tZXJnZShnKTt2YXIgbj1PdChtLHApO2cubGVuZ3RoPyhifHwoaS5wb2x5Z29uU3RhcnQoKSxiPSEwKSxMdChnLFV0LG4sZSxpKSk6biYmKGJ8fChpLnBvbHlnb25TdGFydCgpLGI9ITApLGkubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxpKSxpLmxpbmVFbmQoKSksYiYmKGkucG9seWdvbkVuZCgpLGI9ITEpLGc9cD1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXtpLnBvbHlnb25TdGFydCgpLGkubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxpKSxpLmxpbmVFbmQoKSxpLnBvbHlnb25FbmQoKX19LE09UHQoKSx4PXQoTSksYj0hMTtyZXR1cm4geX19ZnVuY3Rpb24gRHQobil7cmV0dXJuIG4ubGVuZ3RoPjF9ZnVuY3Rpb24gUHQoKXt2YXIgbix0PVtdO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LnB1c2gobj1bXSl9LHBvaW50OmZ1bmN0aW9uKHQsZSl7bi5wdXNoKFt0LGVdKX0sbGluZUVuZDpiLGJ1ZmZlcjpmdW5jdGlvbigpe3ZhciBlPXQ7cmV0dXJuIHQ9W10sbj1udWxsLGV9LHJlam9pbjpmdW5jdGlvbigpe3QubGVuZ3RoPjEmJnQucHVzaCh0LnBvcCgpLmNvbmNhdCh0LnNoaWZ0KCkpKX19fWZ1bmN0aW9uIFV0KG4sdCl7cmV0dXJuKChuPW4ueClbMF08MD9uWzFdLUhhLURhOkhhLW5bMV0pLSgodD10LngpWzBdPDA/dFsxXS1IYS1EYTpIYS10WzFdKX1mdW5jdGlvbiBqdChuKXt2YXIgdCxlPU5hTixyPU5hTix1PU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7bi5saW5lU3RhcnQoKSx0PTF9LHBvaW50OmZ1bmN0aW9uKGksYSl7dmFyIG89aT4wP1VhOi1VYSxsPU1hKGktZSk7TWEobC1VYSk8RGE/KG4ucG9pbnQoZSxyPShyK2EpLzI+MD9IYTotSGEpLG4ucG9pbnQodSxyKSxuLmxpbmVFbmQoKSxuLmxpbmVTdGFydCgpLG4ucG9pbnQobyxyKSxuLnBvaW50KGksciksdD0wKTp1IT09byYmbD49VWEmJihNYShlLXUpPERhJiYoZS09dSpEYSksTWEoaS1vKTxEYSYmKGktPW8qRGEpLHI9RnQoZSxyLGksYSksbi5wb2ludCh1LHIpLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChvLHIpLHQ9MCksbi5wb2ludChlPWkscj1hKSx1PW99LGxpbmVFbmQ6ZnVuY3Rpb24oKXtuLmxpbmVFbmQoKSxlPXI9TmFOfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLXR9fX1mdW5jdGlvbiBGdChuLHQsZSxyKXt2YXIgdSxpLGE9TWF0aC5zaW4obi1lKTtyZXR1cm4gTWEoYSk+RGE/TWF0aC5hdGFuKChNYXRoLnNpbih0KSooaT1NYXRoLmNvcyhyKSkqTWF0aC5zaW4oZSktTWF0aC5zaW4ocikqKHU9TWF0aC5jb3ModCkpKk1hdGguc2luKG4pKS8odSppKmEpKToodCtyKS8yfWZ1bmN0aW9uIEh0KG4sdCxlLHIpe3ZhciB1O2lmKG51bGw9PW4pdT1lKkhhLHIucG9pbnQoLVVhLHUpLHIucG9pbnQoMCx1KSxyLnBvaW50KFVhLHUpLHIucG9pbnQoVWEsMCksci5wb2ludChVYSwtdSksci5wb2ludCgwLC11KSxyLnBvaW50KC1VYSwtdSksci5wb2ludCgtVWEsMCksci5wb2ludCgtVWEsdSk7ZWxzZSBpZihNYShuWzBdLXRbMF0pPkRhKXt2YXIgaT1uWzBdPHRbMF0/VWE6LVVhO3U9ZSppLzIsci5wb2ludCgtaSx1KSxyLnBvaW50KDAsdSksci5wb2ludChpLHUpfWVsc2Ugci5wb2ludCh0WzBdLHRbMV0pfWZ1bmN0aW9uIE90KG4sdCl7dmFyIGU9blswXSxyPW5bMV0sdT1bTWF0aC5zaW4oZSksLU1hdGguY29zKGUpLDBdLGk9MCxhPTA7U28ucmVzZXQoKTtmb3IodmFyIG89MCxsPXQubGVuZ3RoO2w+bzsrK28pe3ZhciBjPXRbb10scz1jLmxlbmd0aDtpZihzKWZvcih2YXIgZj1jWzBdLGg9ZlswXSxnPWZbMV0vMitVYS80LHA9TWF0aC5zaW4oZyksdj1NYXRoLmNvcyhnKSxkPTE7Oyl7ZD09PXMmJihkPTApLG49Y1tkXTt2YXIgbT1uWzBdLHk9blsxXS8yK1VhLzQsTT1NYXRoLnNpbih5KSx4PU1hdGguY29zKHkpLGI9bS1oLF89Yj49MD8xOi0xLHc9XypiLFM9dz5VYSxrPXAqTTtpZihTby5hZGQoTWF0aC5hdGFuMihrKl8qTWF0aC5zaW4odyksdip4K2sqTWF0aC5jb3ModykpKSxpKz1TP2IrXypqYTpiLFNeaD49ZV5tPj1lKXt2YXIgTj15dChkdChmKSxkdChuKSk7YnQoTik7dmFyIEU9eXQodSxOKTtidChFKTt2YXIgQT0oU15iPj0wPy0xOjEpKnRuKEVbMl0pOyhyPkF8fHI9PT1BJiYoTlswXXx8TlsxXSkpJiYoYSs9U15iPj0wPzE6LTEpfWlmKCFkKyspYnJlYWs7aD1tLHA9TSx2PXgsZj1ufX1yZXR1cm4oLURhPml8fERhPmkmJjA+U28pXjEmYX1mdW5jdGlvbiBJdChuKXtmdW5jdGlvbiB0KG4sdCl7cmV0dXJuIE1hdGguY29zKG4pKk1hdGguY29zKHQpPml9ZnVuY3Rpb24gZShuKXt2YXIgZSxpLGwsYyxzO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtjPWw9ITEscz0xfSxwb2ludDpmdW5jdGlvbihmLGgpe3ZhciBnLHA9W2YsaF0sdj10KGYsaCksZD1hP3Y/MDp1KGYsaCk6dj91KGYrKDA+Zj9VYTotVWEpLGgpOjA7aWYoIWUmJihjPWw9dikmJm4ubGluZVN0YXJ0KCksdiE9PWwmJihnPXIoZSxwKSwod3QoZSxnKXx8d3QocCxnKSkmJihwWzBdKz1EYSxwWzFdKz1EYSx2PXQocFswXSxwWzFdKSkpLHYhPT1sKXM9MCx2PyhuLmxpbmVTdGFydCgpLGc9cihwLGUpLG4ucG9pbnQoZ1swXSxnWzFdKSk6KGc9cihlLHApLG4ucG9pbnQoZ1swXSxnWzFdKSxuLmxpbmVFbmQoKSksZT1nO2Vsc2UgaWYobyYmZSYmYV52KXt2YXIgbTtkJml8fCEobT1yKHAsZSwhMCkpfHwocz0wLGE/KG4ubGluZVN0YXJ0KCksbi5wb2ludChtWzBdWzBdLG1bMF1bMV0pLG4ucG9pbnQobVsxXVswXSxtWzFdWzFdKSxuLmxpbmVFbmQoKSk6KG4ucG9pbnQobVsxXVswXSxtWzFdWzFdKSxuLmxpbmVFbmQoKSxuLmxpbmVTdGFydCgpLG4ucG9pbnQobVswXVswXSxtWzBdWzFdKSkpfSF2fHxlJiZ3dChlLHApfHxuLnBvaW50KHBbMF0scFsxXSksZT1wLGw9dixpPWR9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtsJiZuLmxpbmVFbmQoKSxlPW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIHN8KGMmJmwpPDwxfX19ZnVuY3Rpb24gcihuLHQsZSl7dmFyIHI9ZHQobiksdT1kdCh0KSxhPVsxLDAsMF0sbz15dChyLHUpLGw9bXQobyxvKSxjPW9bMF0scz1sLWMqYztpZighcylyZXR1cm4hZSYmbjt2YXIgZj1pKmwvcyxoPS1pKmMvcyxnPXl0KGEsbykscD14dChhLGYpLHY9eHQobyxoKTtNdChwLHYpO3ZhciBkPWcsbT1tdChwLGQpLHk9bXQoZCxkKSxNPW0qbS15KihtdChwLHApLTEpO2lmKCEoMD5NKSl7dmFyIHg9TWF0aC5zcXJ0KE0pLGI9eHQoZCwoLW0teCkveSk7aWYoTXQoYixwKSxiPV90KGIpLCFlKXJldHVybiBiO3ZhciBfLHc9blswXSxTPXRbMF0saz1uWzFdLE49dFsxXTt3PlMmJihfPXcsdz1TLFM9Xyk7dmFyIEU9Uy13LEE9TWEoRS1VYSk8RGEsQz1BfHxEYT5FO2lmKCFBJiZrPk4mJihfPWssaz1OLE49XyksQz9BP2srTj4wXmJbMV08KE1hKGJbMF0tdyk8RGE/azpOKTprPD1iWzFdJiZiWzFdPD1OOkU+VWFeKHc8PWJbMF0mJmJbMF08PVMpKXt2YXIgej14dChkLCgtbSt4KS95KTtyZXR1cm4gTXQoeixwKSxbYixfdCh6KV19fX1mdW5jdGlvbiB1KHQsZSl7dmFyIHI9YT9uOlVhLW4sdT0wO3JldHVybi1yPnQ/dXw9MTp0PnImJih1fD0yKSwtcj5lP3V8PTQ6ZT5yJiYodXw9OCksdX12YXIgaT1NYXRoLmNvcyhuKSxhPWk+MCxvPU1hKGkpPkRhLGw9dmUobiw2Kk9hKTtyZXR1cm4gUnQodCxlLGwsYT9bMCwtbl06Wy1VYSxuLVVhXSl9ZnVuY3Rpb24gWXQobix0LGUscil7cmV0dXJuIGZ1bmN0aW9uKHUpe3ZhciBpLGE9dS5hLG89dS5iLGw9YS54LGM9YS55LHM9by54LGY9by55LGg9MCxnPTEscD1zLWwsdj1mLWM7aWYoaT1uLWwscHx8IShpPjApKXtpZihpLz1wLDA+cCl7aWYoaD5pKXJldHVybjtnPmkmJihnPWkpfWVsc2UgaWYocD4wKXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9aWYoaT1lLWwscHx8ISgwPmkpKXtpZihpLz1wLDA+cCl7aWYoaT5nKXJldHVybjtpPmgmJihoPWkpfWVsc2UgaWYocD4wKXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9aWYoaT10LWMsdnx8IShpPjApKXtpZihpLz12LDA+dil7aWYoaD5pKXJldHVybjtnPmkmJihnPWkpfWVsc2UgaWYodj4wKXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9aWYoaT1yLWMsdnx8ISgwPmkpKXtpZihpLz12LDA+dil7aWYoaT5nKXJldHVybjtpPmgmJihoPWkpfWVsc2UgaWYodj4wKXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9cmV0dXJuIGg+MCYmKHUuYT17eDpsK2gqcCx5OmMraCp2fSksMT5nJiYodS5iPXt4OmwrZypwLHk6YytnKnZ9KSx1fX19fX19ZnVuY3Rpb24gWnQobix0LGUscil7ZnVuY3Rpb24gdShyLHUpe3JldHVybiBNYShyWzBdLW4pPERhP3U+MD8wOjM6TWEoclswXS1lKTxEYT91PjA/MjoxOk1hKHJbMV0tdCk8RGE/dT4wPzE6MDp1PjA/MzoyfWZ1bmN0aW9uIGkobix0KXtyZXR1cm4gYShuLngsdC54KX1mdW5jdGlvbiBhKG4sdCl7dmFyIGU9dShuLDEpLHI9dSh0LDEpO3JldHVybiBlIT09cj9lLXI6MD09PWU/dFsxXS1uWzFdOjE9PT1lP25bMF0tdFswXToyPT09ZT9uWzFdLXRbMV06dFswXS1uWzBdfXJldHVybiBmdW5jdGlvbihvKXtmdW5jdGlvbiBsKG4pe2Zvcih2YXIgdD0wLGU9ZC5sZW5ndGgscj1uWzFdLHU9MDtlPnU7Kyt1KWZvcih2YXIgaSxhPTEsbz1kW3VdLGw9by5sZW5ndGgsYz1vWzBdO2w+YTsrK2EpaT1vW2FdLGNbMV08PXI/aVsxXT5yJiZRKGMsaSxuKT4wJiYrK3Q6aVsxXTw9ciYmUShjLGksbik8MCYmLS10LGM9aTtyZXR1cm4gMCE9PXR9ZnVuY3Rpb24gYyhpLG8sbCxjKXt2YXIgcz0wLGY9MDtpZihudWxsPT1pfHwocz11KGksbCkpIT09KGY9dShvLGwpKXx8YShpLG8pPDBebD4wKXtkbyBjLnBvaW50KDA9PT1zfHwzPT09cz9uOmUscz4xP3I6dCk7d2hpbGUoKHM9KHMrbCs0KSU0KSE9PWYpfWVsc2UgYy5wb2ludChvWzBdLG9bMV0pfWZ1bmN0aW9uIHModSxpKXtyZXR1cm4gdT49biYmZT49dSYmaT49dCYmcj49aX1mdW5jdGlvbiBmKG4sdCl7cyhuLHQpJiZvLnBvaW50KG4sdCl9ZnVuY3Rpb24gaCgpe0MucG9pbnQ9cCxkJiZkLnB1c2gobT1bXSksUz0hMCx3PSExLGI9Xz1OYU59ZnVuY3Rpb24gZygpe3YmJihwKHksTSkseCYmdyYmRS5yZWpvaW4oKSx2LnB1c2goRS5idWZmZXIoKSkpLEMucG9pbnQ9Zix3JiZvLmxpbmVFbmQoKX1mdW5jdGlvbiBwKG4sdCl7bj1NYXRoLm1heCgtRm8sTWF0aC5taW4oRm8sbikpLHQ9TWF0aC5tYXgoLUZvLE1hdGgubWluKEZvLHQpKTt2YXIgZT1zKG4sdCk7aWYoZCYmbS5wdXNoKFtuLHRdKSxTKXk9bixNPXQseD1lLFM9ITEsZSYmKG8ubGluZVN0YXJ0KCksby5wb2ludChuLHQpKTtlbHNlIGlmKGUmJncpby5wb2ludChuLHQpO2Vsc2V7dmFyIHI9e2E6e3g6Yix5Ol99LGI6e3g6bix5OnR9fTtBKHIpPyh3fHwoby5saW5lU3RhcnQoKSxvLnBvaW50KHIuYS54LHIuYS55KSksby5wb2ludChyLmIueCxyLmIueSksZXx8by5saW5lRW5kKCksaz0hMSk6ZSYmKG8ubGluZVN0YXJ0KCksby5wb2ludChuLHQpLGs9ITEpfWI9bixfPXQsdz1lfXZhciB2LGQsbSx5LE0seCxiLF8sdyxTLGssTj1vLEU9UHQoKSxBPVl0KG4sdCxlLHIpLEM9e3BvaW50OmYsbGluZVN0YXJ0OmgsbGluZUVuZDpnLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe289RSx2PVtdLGQ9W10saz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe289Tix2PW9hLm1lcmdlKHYpO3ZhciB0PWwoW24scl0pLGU9ayYmdCx1PXYubGVuZ3RoOyhlfHx1KSYmKG8ucG9seWdvblN0YXJ0KCksZSYmKG8ubGluZVN0YXJ0KCksYyhudWxsLG51bGwsMSxvKSxvLmxpbmVFbmQoKSksdSYmTHQodixpLHQsYyxvKSxvLnBvbHlnb25FbmQoKSksdj1kPW09bnVsbH19O3JldHVybiBDfX1mdW5jdGlvbiBWdChuKXt2YXIgdD0wLGU9VWEvMyxyPW9lKG4pLHU9cih0LGUpO3JldHVybiB1LnBhcmFsbGVscz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9yKHQ9blswXSpVYS8xODAsZT1uWzFdKlVhLzE4MCk6W3QvVWEqMTgwLGUvVWEqMTgwXX0sdX1mdW5jdGlvbiBYdChuLHQpe2Z1bmN0aW9uIGUobix0KXt2YXIgZT1NYXRoLnNxcnQoaS0yKnUqTWF0aC5zaW4odCkpL3U7cmV0dXJuW2UqTWF0aC5zaW4obio9dSksYS1lKk1hdGguY29zKG4pXX12YXIgcj1NYXRoLnNpbihuKSx1PShyK01hdGguc2luKHQpKS8yLGk9MStyKigyKnUtciksYT1NYXRoLnNxcnQoaSkvdTtyZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1hLXQ7cmV0dXJuW01hdGguYXRhbjIobixlKS91LHRuKChpLShuKm4rZSplKSp1KnUpLygyKnUpKV19LGV9ZnVuY3Rpb24gJHQoKXtmdW5jdGlvbiBuKG4sdCl7T28rPXUqbi1yKnQscj1uLHU9dH12YXIgdCxlLHIsdTtYby5wb2ludD1mdW5jdGlvbihpLGEpe1hvLnBvaW50PW4sdD1yPWksZT11PWF9LFhvLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSl9fWZ1bmN0aW9uIEJ0KG4sdCl7SW8+biYmKElvPW4pLG4+Wm8mJihabz1uKSxZbz50JiYoWW89dCksdD5WbyYmKFZvPXQpfWZ1bmN0aW9uIFd0KCl7ZnVuY3Rpb24gbihuLHQpe2EucHVzaCgiTSIsbiwiLCIsdCxpKX1mdW5jdGlvbiB0KG4sdCl7YS5wdXNoKCJNIixuLCIsIix0KSxvLnBvaW50PWV9ZnVuY3Rpb24gZShuLHQpe2EucHVzaCgiTCIsbiwiLCIsdCl9ZnVuY3Rpb24gcigpe28ucG9pbnQ9bn1mdW5jdGlvbiB1KCl7YS5wdXNoKCJaIil9dmFyIGk9SnQoNC41KSxhPVtdLG89e3BvaW50Om4sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7by5wb2ludD10fSxsaW5lRW5kOnIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7by5saW5lRW5kPXV9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtvLmxpbmVFbmQ9cixvLnBvaW50PW59LHBvaW50UmFkaXVzOmZ1bmN0aW9uKG4pe3JldHVybiBpPUp0KG4pLG99LHJlc3VsdDpmdW5jdGlvbigpe2lmKGEubGVuZ3RoKXt2YXIgbj1hLmpvaW4oIiIpO3JldHVybiBhPVtdLG59fX07cmV0dXJuIG99ZnVuY3Rpb24gSnQobil7cmV0dXJuIm0wLCIrbisiYSIrbisiLCIrbisiIDAgMSwxIDAsIistMipuKyJhIituKyIsIituKyIgMCAxLDEgMCwiKzIqbisieiJ9ZnVuY3Rpb24gR3Qobix0KXtBbys9bixDbys9dCwrK3pvfWZ1bmN0aW9uIEt0KCl7ZnVuY3Rpb24gbihuLHIpe3ZhciB1PW4tdCxpPXItZSxhPU1hdGguc3FydCh1KnUraSppKTtMbys9YSoodCtuKS8yLHFvKz1hKihlK3IpLzIsVG8rPWEsR3QodD1uLGU9cil9dmFyIHQsZTtCby5wb2ludD1mdW5jdGlvbihyLHUpe0JvLnBvaW50PW4sR3QodD1yLGU9dSl9fWZ1bmN0aW9uIFF0KCl7Qm8ucG9pbnQ9R3R9ZnVuY3Rpb24gbmUoKXtmdW5jdGlvbiBuKG4sdCl7dmFyIGU9bi1yLGk9dC11LGE9TWF0aC5zcXJ0KGUqZStpKmkpO0xvKz1hKihyK24pLzIscW8rPWEqKHUrdCkvMixUbys9YSxhPXUqbi1yKnQsUm8rPWEqKHIrbiksRG8rPWEqKHUrdCksUG8rPTMqYSxHdChyPW4sdT10KX12YXIgdCxlLHIsdTtCby5wb2ludD1mdW5jdGlvbihpLGEpe0JvLnBvaW50PW4sR3QodD1yPWksZT11PWEpfSxCby5saW5lRW5kPWZ1bmN0aW9uKCl7bih0LGUpfX1mdW5jdGlvbiB0ZShuKXtmdW5jdGlvbiB0KHQsZSl7bi5tb3ZlVG8odCthLGUpLG4uYXJjKHQsZSxhLDAsamEpfWZ1bmN0aW9uIGUodCxlKXtuLm1vdmVUbyh0LGUpLG8ucG9pbnQ9cn1mdW5jdGlvbiByKHQsZSl7bi5saW5lVG8odCxlKX1mdW5jdGlvbiB1KCl7by5wb2ludD10fWZ1bmN0aW9uIGkoKXtuLmNsb3NlUGF0aCgpfXZhciBhPTQuNSxvPXtwb2ludDp0LGxpbmVTdGFydDpmdW5jdGlvbigpe28ucG9pbnQ9ZX0sbGluZUVuZDp1LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe28ubGluZUVuZD1pfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7by5saW5lRW5kPXUsby5wb2ludD10fSxwb2ludFJhZGl1czpmdW5jdGlvbihuKXtyZXR1cm4gYT1uLG99LHJlc3VsdDpifTtyZXR1cm4gb31mdW5jdGlvbiBlZShuKXtmdW5jdGlvbiB0KG4pe3JldHVybihvP3I6ZSkobil9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gaWUodCxmdW5jdGlvbihlLHIpe2U9bihlLHIpLHQucG9pbnQoZVswXSxlWzFdKX0pfWZ1bmN0aW9uIHIodCl7ZnVuY3Rpb24gZShlLHIpe2U9bihlLHIpLHQucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiByKCl7TT1OYU4sUy5wb2ludD1pLHQubGluZVN0YXJ0KCl9ZnVuY3Rpb24gaShlLHIpe3ZhciBpPWR0KFtlLHJdKSxhPW4oZSxyKTt1KE0seCx5LGIsXyx3LE09YVswXSx4PWFbMV0seT1lLGI9aVswXSxfPWlbMV0sdz1pWzJdLG8sdCksdC5wb2ludChNLHgpfWZ1bmN0aW9uIGEoKXtTLnBvaW50PWUsdC5saW5lRW5kKCl9ZnVuY3Rpb24gbCgpewpyKCksUy5wb2ludD1jLFMubGluZUVuZD1zfWZ1bmN0aW9uIGMobix0KXtpKGY9bixoPXQpLGc9TSxwPXgsdj1iLGQ9XyxtPXcsUy5wb2ludD1pfWZ1bmN0aW9uIHMoKXt1KE0seCx5LGIsXyx3LGcscCxmLHYsZCxtLG8sdCksUy5saW5lRW5kPWEsYSgpfXZhciBmLGgsZyxwLHYsZCxtLHksTSx4LGIsXyx3LFM9e3BvaW50OmUsbGluZVN0YXJ0OnIsbGluZUVuZDphLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3QucG9seWdvblN0YXJ0KCksUy5saW5lU3RhcnQ9bH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3QucG9seWdvbkVuZCgpLFMubGluZVN0YXJ0PXJ9fTtyZXR1cm4gU31mdW5jdGlvbiB1KHQsZSxyLG8sbCxjLHMsZixoLGcscCx2LGQsbSl7dmFyIHk9cy10LE09Zi1lLHg9eSp5K00qTTtpZih4PjQqaSYmZC0tKXt2YXIgYj1vK2csXz1sK3Asdz1jK3YsUz1NYXRoLnNxcnQoYipiK18qXyt3KncpLGs9TWF0aC5hc2luKHcvPVMpLE49TWEoTWEodyktMSk8RGF8fE1hKHItaCk8RGE/KHIraCkvMjpNYXRoLmF0YW4yKF8sYiksRT1uKE4sayksQT1FWzBdLEM9RVsxXSx6PUEtdCxMPUMtZSxxPU0qei15Kkw7KHEqcS94Pml8fE1hKCh5KnorTSpMKS94LS41KT4uM3x8YT5vKmcrbCpwK2MqdikmJih1KHQsZSxyLG8sbCxjLEEsQyxOLGIvPVMsXy89Uyx3LGQsbSksbS5wb2ludChBLEMpLHUoQSxDLE4sYixfLHcscyxmLGgsZyxwLHYsZCxtKSl9fXZhciBpPS41LGE9TWF0aC5jb3MoMzAqT2EpLG89MTY7cmV0dXJuIHQucHJlY2lzaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPShpPW4qbik+MCYmMTYsdCk6TWF0aC5zcXJ0KGkpfSx0fWZ1bmN0aW9uIHJlKG4pe3ZhciB0PWVlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oW3QqSWEsZSpJYV0pfSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBsZSh0KG4pKX19ZnVuY3Rpb24gdWUobil7dGhpcy5zdHJlYW09bn1mdW5jdGlvbiBpZShuLHQpe3JldHVybntwb2ludDp0LHNwaGVyZTpmdW5jdGlvbigpe24uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe24ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtuLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bi5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpfX19ZnVuY3Rpb24gYWUobil7cmV0dXJuIG9lKGZ1bmN0aW9uKCl7cmV0dXJuIG59KSgpfWZ1bmN0aW9uIG9lKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuIG49byhuWzBdKk9hLG5bMV0qT2EpLFtuWzBdKmgrbCxjLW5bMV0qaF19ZnVuY3Rpb24gZShuKXtyZXR1cm4gbj1vLmludmVydCgoblswXS1sKS9oLChjLW5bMV0pL2gpLG4mJltuWzBdKklhLG5bMV0qSWFdfWZ1bmN0aW9uIHIoKXtvPUN0KGE9ZmUobSxNLHgpLGkpO3ZhciBuPWkodixkKTtyZXR1cm4gbD1nLW5bMF0qaCxjPXArblsxXSpoLHUoKX1mdW5jdGlvbiB1KCl7cmV0dXJuIHMmJihzLnZhbGlkPSExLHM9bnVsbCksdH12YXIgaSxhLG8sbCxjLHMsZj1lZShmdW5jdGlvbihuLHQpe3JldHVybiBuPWkobix0KSxbblswXSpoK2wsYy1uWzFdKmhdfSksaD0xNTAsZz00ODAscD0yNTAsdj0wLGQ9MCxtPTAsTT0wLHg9MCxiPWpvLF89eSx3PW51bGwsUz1udWxsO3JldHVybiB0LnN0cmVhbT1mdW5jdGlvbihuKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEpLHM9bGUoYihhLGYoXyhuKSkpKSxzLnZhbGlkPSEwLHN9LHQuY2xpcEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPW51bGw9PW4/KHc9bixqbyk6SXQoKHc9K24pKk9hKSx1KCkpOnd9LHQuY2xpcEV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oUz1uLF89bj9adChuWzBdWzBdLG5bMF1bMV0sblsxXVswXSxuWzFdWzFdKTp5LHUoKSk6U30sdC5zY2FsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rbixyKCkpOmh9LHQudHJhbnNsYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPStuWzBdLHA9K25bMV0scigpKTpbZyxwXX0sdC5jZW50ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9blswXSUzNjAqT2EsZD1uWzFdJTM2MCpPYSxyKCkpOlt2KklhLGQqSWFdfSx0LnJvdGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1uWzBdJTM2MCpPYSxNPW5bMV0lMzYwKk9hLHg9bi5sZW5ndGg+Mj9uWzJdJTM2MCpPYTowLHIoKSk6W20qSWEsTSpJYSx4KklhXX0sb2EucmViaW5kKHQsZiwicHJlY2lzaW9uIiksZnVuY3Rpb24oKXtyZXR1cm4gaT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmludmVydD1pLmludmVydCYmZSxyKCl9fWZ1bmN0aW9uIGxlKG4pe3JldHVybiBpZShuLGZ1bmN0aW9uKHQsZSl7bi5wb2ludCh0Kk9hLGUqT2EpfSl9ZnVuY3Rpb24gY2Uobix0KXtyZXR1cm5bbix0XX1mdW5jdGlvbiBzZShuLHQpe3JldHVybltuPlVhP24tamE6LVVhPm4/bitqYTpuLHRdfWZ1bmN0aW9uIGZlKG4sdCxlKXtyZXR1cm4gbj90fHxlP0N0KGdlKG4pLHBlKHQsZSkpOmdlKG4pOnR8fGU/cGUodCxlKTpzZX1mdW5jdGlvbiBoZShuKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdCs9bixbdD5VYT90LWphOi1VYT50P3QramE6dCxlXX19ZnVuY3Rpb24gZ2Uobil7dmFyIHQ9aGUobik7cmV0dXJuIHQuaW52ZXJ0PWhlKC1uKSx0fWZ1bmN0aW9uIHBlKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguY29zKHQpLG89TWF0aC5jb3MobikqZSxsPU1hdGguc2luKG4pKmUsYz1NYXRoLnNpbih0KSxzPWMqcitvKnU7cmV0dXJuW01hdGguYXRhbjIobCppLXMqYSxvKnItYyp1KSx0bihzKmkrbCphKV19dmFyIHI9TWF0aC5jb3MobiksdT1NYXRoLnNpbihuKSxpPU1hdGguY29zKHQpLGE9TWF0aC5zaW4odCk7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7dmFyIGU9TWF0aC5jb3ModCksbz1NYXRoLmNvcyhuKSplLGw9TWF0aC5zaW4obikqZSxjPU1hdGguc2luKHQpLHM9YyppLWwqYTtyZXR1cm5bTWF0aC5hdGFuMihsKmkrYyphLG8qcitzKnUpLHRuKHMqci1vKnUpXX0sZX1mdW5jdGlvbiB2ZShuLHQpe3ZhciBlPU1hdGguY29zKG4pLHI9TWF0aC5zaW4obik7cmV0dXJuIGZ1bmN0aW9uKHUsaSxhLG8pe3ZhciBsPWEqdDtudWxsIT11Pyh1PWRlKGUsdSksaT1kZShlLGkpLChhPjA/aT51OnU+aSkmJih1Kz1hKmphKSk6KHU9bithKmphLGk9bi0uNSpsKTtmb3IodmFyIGMscz11O2E+MD9zPmk6aT5zO3MtPWwpby5wb2ludCgoYz1fdChbZSwtcipNYXRoLmNvcyhzKSwtcipNYXRoLnNpbihzKV0pKVswXSxjWzFdKX19ZnVuY3Rpb24gZGUobix0KXt2YXIgZT1kdCh0KTtlWzBdLT1uLGJ0KGUpO3ZhciByPW5uKC1lWzFdKTtyZXR1cm4oKC1lWzJdPDA/LXI6cikrMipNYXRoLlBJLURhKSUoMipNYXRoLlBJKX1mdW5jdGlvbiBtZShuLHQsZSl7dmFyIHI9b2EucmFuZ2Uobix0LURhLGUpLmNvbmNhdCh0KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKHQpe3JldHVybltuLHRdfSl9fWZ1bmN0aW9uIHllKG4sdCxlKXt2YXIgcj1vYS5yYW5nZShuLHQtRGEsZSkuY29uY2F0KHQpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gTWUobil7cmV0dXJuIG4uc291cmNlfWZ1bmN0aW9uIHhlKG4pe3JldHVybiBuLnRhcmdldH1mdW5jdGlvbiBiZShuLHQsZSxyKXt2YXIgdT1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpLGE9TWF0aC5jb3Mociksbz1NYXRoLnNpbihyKSxsPXUqTWF0aC5jb3MobiksYz11Kk1hdGguc2luKG4pLHM9YSpNYXRoLmNvcyhlKSxmPWEqTWF0aC5zaW4oZSksaD0yKk1hdGguYXNpbihNYXRoLnNxcnQoYW4oci10KSt1KmEqYW4oZS1uKSkpLGc9MS9NYXRoLnNpbihoKSxwPWg/ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zaW4obio9aCkqZyxlPU1hdGguc2luKGgtbikqZyxyPWUqbCt0KnMsdT1lKmMrdCpmLGE9ZSppK3QqbztyZXR1cm5bTWF0aC5hdGFuMih1LHIpKklhLE1hdGguYXRhbjIoYSxNYXRoLnNxcnQocipyK3UqdSkpKklhXX06ZnVuY3Rpb24oKXtyZXR1cm5bbipJYSx0KklhXX07cmV0dXJuIHAuZGlzdGFuY2U9aCxwfWZ1bmN0aW9uIF9lKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBpPU1hdGguc2luKHUqPU9hKSxhPU1hdGguY29zKHUpLG89TWEoKG4qPU9hKS10KSxsPU1hdGguY29zKG8pO1dvKz1NYXRoLmF0YW4yKE1hdGguc3FydCgobz1hKk1hdGguc2luKG8pKSpvKyhvPXIqaS1lKmEqbCkqbyksZSppK3IqYSpsKSx0PW4sZT1pLHI9YX12YXIgdCxlLHI7Sm8ucG9pbnQ9ZnVuY3Rpb24odSxpKXt0PXUqT2EsZT1NYXRoLnNpbihpKj1PYSkscj1NYXRoLmNvcyhpKSxKby5wb2ludD1ufSxKby5saW5lRW5kPWZ1bmN0aW9uKCl7Sm8ucG9pbnQ9Sm8ubGluZUVuZD1ifX1mdW5jdGlvbiB3ZShuLHQpe2Z1bmN0aW9uIGUodCxlKXt2YXIgcj1NYXRoLmNvcyh0KSx1PU1hdGguY29zKGUpLGk9bihyKnUpO3JldHVybltpKnUqTWF0aC5zaW4odCksaSpNYXRoLnNpbihlKV19cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKG4sZSl7dmFyIHI9TWF0aC5zcXJ0KG4qbitlKmUpLHU9dChyKSxpPU1hdGguc2luKHUpLGE9TWF0aC5jb3ModSk7cmV0dXJuW01hdGguYXRhbjIobippLHIqYSksTWF0aC5hc2luKHImJmUqaS9yKV19LGV9ZnVuY3Rpb24gU2Uobix0KXtmdW5jdGlvbiBlKG4sdCl7YT4wPy1IYStEYT50JiYodD0tSGErRGEpOnQ+SGEtRGEmJih0PUhhLURhKTt2YXIgZT1hL01hdGgucG93KHUodCksaSk7cmV0dXJuW2UqTWF0aC5zaW4oaSpuKSxhLWUqTWF0aC5jb3MoaSpuKV19dmFyIHI9TWF0aC5jb3MobiksdT1mdW5jdGlvbihuKXtyZXR1cm4gTWF0aC50YW4oVWEvNCtuLzIpfSxpPW49PT10P01hdGguc2luKG4pOk1hdGgubG9nKHIvTWF0aC5jb3ModCkpL01hdGgubG9nKHUodCkvdShuKSksYT1yKk1hdGgucG93KHUobiksaSkvaTtyZXR1cm4gaT8oZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1hLXQscj1LKGkpKk1hdGguc3FydChuKm4rZSplKTtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL2ksMipNYXRoLmF0YW4oTWF0aC5wb3coYS9yLDEvaSkpLUhhXX0sZSk6TmV9ZnVuY3Rpb24ga2Uobix0KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9aS10O3JldHVybltlKk1hdGguc2luKHUqbiksaS1lKk1hdGguY29zKHUqbildfXZhciByPU1hdGguY29zKG4pLHU9bj09PXQ/TWF0aC5zaW4obik6KHItTWF0aC5jb3ModCkpLyh0LW4pLGk9ci91K247cmV0dXJuIE1hKHUpPERhP2NlOihlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPWktdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsaS1LKHUpKk1hdGguc3FydChuKm4rZSplKV19LGUpfWZ1bmN0aW9uIE5lKG4sdCl7cmV0dXJuW24sTWF0aC5sb2coTWF0aC50YW4oVWEvNCt0LzIpKV19ZnVuY3Rpb24gRWUobil7dmFyIHQsZT1hZShuKSxyPWUuc2NhbGUsdT1lLnRyYW5zbGF0ZSxpPWUuY2xpcEV4dGVudDtyZXR1cm4gZS5zY2FsZT1mdW5jdGlvbigpe3ZhciBuPXIuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiBuPT09ZT90P2UuY2xpcEV4dGVudChudWxsKTplOm59LGUudHJhbnNsYXRlPWZ1bmN0aW9uKCl7dmFyIG49dS5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIG49PT1lP3Q/ZS5jbGlwRXh0ZW50KG51bGwpOmU6bn0sZS5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3ZhciBhPWkuYXBwbHkoZSxhcmd1bWVudHMpO2lmKGE9PT1lKXtpZih0PW51bGw9PW4pe3ZhciBvPVVhKnIoKSxsPXUoKTtpKFtbbFswXS1vLGxbMV0tb10sW2xbMF0rbyxsWzFdK29dXSl9fWVsc2UgdCYmKGE9bnVsbCk7cmV0dXJuIGF9LGUuY2xpcEV4dGVudChudWxsKX1mdW5jdGlvbiBBZShuLHQpe3JldHVybltNYXRoLmxvZyhNYXRoLnRhbihVYS80K3QvMikpLC1uXX1mdW5jdGlvbiBDZShuKXtyZXR1cm4gblswXX1mdW5jdGlvbiB6ZShuKXtyZXR1cm4gblsxXX1mdW5jdGlvbiBMZShuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1bMCwxXSxyPTIsdT0yO3Q+dTt1Kyspe2Zvcig7cj4xJiZRKG5bZVtyLTJdXSxuW2Vbci0xXV0sblt1XSk8PTA7KS0tcjtlW3IrK109dX1yZXR1cm4gZS5zbGljZSgwLHIpfWZ1bmN0aW9uIHFlKG4sdCl7cmV0dXJuIG5bMF0tdFswXXx8blsxXS10WzFdfWZ1bmN0aW9uIFRlKG4sdCxlKXtyZXR1cm4oZVswXS10WzBdKSooblsxXS10WzFdKTwoZVsxXS10WzFdKSooblswXS10WzBdKX1mdW5jdGlvbiBSZShuLHQsZSxyKXt2YXIgdT1uWzBdLGk9ZVswXSxhPXRbMF0tdSxvPXJbMF0taSxsPW5bMV0sYz1lWzFdLHM9dFsxXS1sLGY9clsxXS1jLGg9KG8qKGwtYyktZioodS1pKSkvKGYqYS1vKnMpO3JldHVyblt1K2gqYSxsK2gqc119ZnVuY3Rpb24gRGUobil7dmFyIHQ9blswXSxlPW5bbi5sZW5ndGgtMV07cmV0dXJuISh0WzBdLWVbMF18fHRbMV0tZVsxXSl9ZnVuY3Rpb24gUGUoKXtycih0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gVWUobil7dmFyIHQ9bGwucG9wKCl8fG5ldyBQZTtyZXR1cm4gdC5zaXRlPW4sdH1mdW5jdGlvbiBqZShuKXtCZShuKSxpbC5yZW1vdmUobiksbGwucHVzaChuKSxycihuKX1mdW5jdGlvbiBGZShuKXt2YXIgdD1uLmNpcmNsZSxlPXQueCxyPXQuY3ksdT17eDplLHk6cn0saT1uLlAsYT1uLk4sbz1bbl07amUobik7Zm9yKHZhciBsPWk7bC5jaXJjbGUmJk1hKGUtbC5jaXJjbGUueCk8RGEmJk1hKHItbC5jaXJjbGUuY3kpPERhOylpPWwuUCxvLnVuc2hpZnQobCksamUobCksbD1pO28udW5zaGlmdChsKSxCZShsKTtmb3IodmFyIGM9YTtjLmNpcmNsZSYmTWEoZS1jLmNpcmNsZS54KTxEYSYmTWEoci1jLmNpcmNsZS5jeSk8RGE7KWE9Yy5OLG8ucHVzaChjKSxqZShjKSxjPWE7by5wdXNoKGMpLEJlKGMpO3ZhciBzLGY9by5sZW5ndGg7Zm9yKHM9MTtmPnM7KytzKWM9b1tzXSxsPW9bcy0xXSxucihjLmVkZ2UsbC5zaXRlLGMuc2l0ZSx1KTtsPW9bMF0sYz1vW2YtMV0sYy5lZGdlPUtlKGwuc2l0ZSxjLnNpdGUsbnVsbCx1KSwkZShsKSwkZShjKX1mdW5jdGlvbiBIZShuKXtmb3IodmFyIHQsZSxyLHUsaT1uLngsYT1uLnksbz1pbC5fO287KWlmKHI9T2UobyxhKS1pLHI+RGEpbz1vLkw7ZWxzZXtpZih1PWktSWUobyxhKSwhKHU+RGEpKXtyPi1EYT8odD1vLlAsZT1vKTp1Pi1EYT8odD1vLGU9by5OKTp0PWU9bzticmVha31pZighby5SKXt0PW87YnJlYWt9bz1vLlJ9dmFyIGw9VWUobik7aWYoaWwuaW5zZXJ0KHQsbCksdHx8ZSl7aWYodD09PWUpcmV0dXJuIEJlKHQpLGU9VWUodC5zaXRlKSxpbC5pbnNlcnQobCxlKSxsLmVkZ2U9ZS5lZGdlPUtlKHQuc2l0ZSxsLnNpdGUpLCRlKHQpLHZvaWQgJGUoZSk7aWYoIWUpcmV0dXJuIHZvaWQobC5lZGdlPUtlKHQuc2l0ZSxsLnNpdGUpKTtCZSh0KSxCZShlKTt2YXIgYz10LnNpdGUscz1jLngsZj1jLnksaD1uLngtcyxnPW4ueS1mLHA9ZS5zaXRlLHY9cC54LXMsZD1wLnktZixtPTIqKGgqZC1nKnYpLHk9aCpoK2cqZyxNPXYqditkKmQseD17eDooZCp5LWcqTSkvbStzLHk6KGgqTS12KnkpL20rZn07bnIoZS5lZGdlLGMscCx4KSxsLmVkZ2U9S2UoYyxuLG51bGwseCksZS5lZGdlPUtlKG4scCxudWxsLHgpLCRlKHQpLCRlKGUpfX1mdW5jdGlvbiBPZShuLHQpe3ZhciBlPW4uc2l0ZSxyPWUueCx1PWUueSxpPXUtdDtpZighaSlyZXR1cm4gcjt2YXIgYT1uLlA7aWYoIWEpcmV0dXJuLSgxLzApO2U9YS5zaXRlO3ZhciBvPWUueCxsPWUueSxjPWwtdDtpZighYylyZXR1cm4gbzt2YXIgcz1vLXIsZj0xL2ktMS9jLGg9cy9jO3JldHVybiBmPygtaCtNYXRoLnNxcnQoaCpoLTIqZioocypzLygtMipjKS1sK2MvMit1LWkvMikpKS9mK3I6KHIrbykvMn1mdW5jdGlvbiBJZShuLHQpe3ZhciBlPW4uTjtpZihlKXJldHVybiBPZShlLHQpO3ZhciByPW4uc2l0ZTtyZXR1cm4gci55PT09dD9yLng6MS8wfWZ1bmN0aW9uIFllKG4pe3RoaXMuc2l0ZT1uLHRoaXMuZWRnZXM9W119ZnVuY3Rpb24gWmUobil7Zm9yKHZhciB0LGUscix1LGksYSxvLGwsYyxzLGY9blswXVswXSxoPW5bMV1bMF0sZz1uWzBdWzFdLHA9blsxXVsxXSx2PXVsLGQ9di5sZW5ndGg7ZC0tOylpZihpPXZbZF0saSYmaS5wcmVwYXJlKCkpZm9yKG89aS5lZGdlcyxsPW8ubGVuZ3RoLGE9MDtsPmE7KXM9b1thXS5lbmQoKSxyPXMueCx1PXMueSxjPW9bKythJWxdLnN0YXJ0KCksdD1jLngsZT1jLnksKE1hKHItdCk+RGF8fE1hKHUtZSk+RGEpJiYoby5zcGxpY2UoYSwwLG5ldyB0cihRZShpLnNpdGUscyxNYShyLWYpPERhJiZwLXU+RGE/e3g6Zix5Ok1hKHQtZik8RGE/ZTpwfTpNYSh1LXApPERhJiZoLXI+RGE/e3g6TWEoZS1wKTxEYT90OmgseTpwfTpNYShyLWgpPERhJiZ1LWc+RGE/e3g6aCx5Ok1hKHQtaCk8RGE/ZTpnfTpNYSh1LWcpPERhJiZyLWY+RGE/e3g6TWEoZS1nKTxEYT90OmYseTpnfTpudWxsKSxpLnNpdGUsbnVsbCkpLCsrbCl9ZnVuY3Rpb24gVmUobix0KXtyZXR1cm4gdC5hbmdsZS1uLmFuZ2xlfWZ1bmN0aW9uIFhlKCl7cnIodGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uICRlKG4pe3ZhciB0PW4uUCxlPW4uTjtpZih0JiZlKXt2YXIgcj10LnNpdGUsdT1uLnNpdGUsaT1lLnNpdGU7aWYociE9PWkpe3ZhciBhPXUueCxvPXUueSxsPXIueC1hLGM9ci55LW8scz1pLngtYSxmPWkueS1vLGg9MioobCpmLWMqcyk7aWYoIShoPj0tUGEpKXt2YXIgZz1sKmwrYypjLHA9cypzK2YqZix2PShmKmctYypwKS9oLGQ9KGwqcC1zKmcpL2gsZj1kK28sbT1jbC5wb3AoKXx8bmV3IFhlO20uYXJjPW4sbS5zaXRlPXUsbS54PXYrYSxtLnk9ZitNYXRoLnNxcnQodip2K2QqZCksbS5jeT1mLG4uY2lyY2xlPW07Zm9yKHZhciB5PW51bGwsTT1vbC5fO007KWlmKG0ueTxNLnl8fG0ueT09PU0ueSYmbS54PD1NLngpe2lmKCFNLkwpe3k9TS5QO2JyZWFrfU09TS5MfWVsc2V7aWYoIU0uUil7eT1NO2JyZWFrfU09TS5SfW9sLmluc2VydCh5LG0pLHl8fChhbD1tKX19fX1mdW5jdGlvbiBCZShuKXt2YXIgdD1uLmNpcmNsZTt0JiYodC5QfHwoYWw9dC5OKSxvbC5yZW1vdmUodCksY2wucHVzaCh0KSxycih0KSxuLmNpcmNsZT1udWxsKX1mdW5jdGlvbiBXZShuKXtmb3IodmFyIHQsZT1ybCxyPVl0KG5bMF1bMF0sblswXVsxXSxuWzFdWzBdLG5bMV1bMV0pLHU9ZS5sZW5ndGg7dS0tOyl0PWVbdV0sKCFKZSh0LG4pfHwhcih0KXx8TWEodC5hLngtdC5iLngpPERhJiZNYSh0LmEueS10LmIueSk8RGEpJiYodC5hPXQuYj1udWxsLGUuc3BsaWNlKHUsMSkpfWZ1bmN0aW9uIEplKG4sdCl7dmFyIGU9bi5iO2lmKGUpcmV0dXJuITA7dmFyIHIsdSxpPW4uYSxhPXRbMF1bMF0sbz10WzFdWzBdLGw9dFswXVsxXSxjPXRbMV1bMV0scz1uLmwsZj1uLnIsaD1zLngsZz1zLnkscD1mLngsdj1mLnksZD0oaCtwKS8yLG09KGcrdikvMjtpZih2PT09Zyl7aWYoYT5kfHxkPj1vKXJldHVybjtpZihoPnApe2lmKGkpe2lmKGkueT49YylyZXR1cm59ZWxzZSBpPXt4OmQseTpsfTtlPXt4OmQseTpjfX1lbHNle2lmKGkpe2lmKGkueTxsKXJldHVybn1lbHNlIGk9e3g6ZCx5OmN9O2U9e3g6ZCx5Omx9fX1lbHNlIGlmKHI9KGgtcCkvKHYtZyksdT1tLXIqZCwtMT5yfHxyPjEpaWYoaD5wKXtpZihpKXtpZihpLnk+PWMpcmV0dXJufWVsc2UgaT17eDoobC11KS9yLHk6bH07ZT17eDooYy11KS9yLHk6Y319ZWxzZXtpZihpKXtpZihpLnk8bClyZXR1cm59ZWxzZSBpPXt4OihjLXUpL3IseTpjfTtlPXt4OihsLXUpL3IseTpsfX1lbHNlIGlmKHY+Zyl7aWYoaSl7aWYoaS54Pj1vKXJldHVybn1lbHNlIGk9e3g6YSx5OnIqYSt1fTtlPXt4Om8seTpyKm8rdX19ZWxzZXtpZihpKXtpZihpLng8YSlyZXR1cm59ZWxzZSBpPXt4Om8seTpyKm8rdX07ZT17eDphLHk6ciphK3V9fXJldHVybiBuLmE9aSxuLmI9ZSwhMH1mdW5jdGlvbiBHZShuLHQpe3RoaXMubD1uLHRoaXMucj10LHRoaXMuYT10aGlzLmI9bnVsbH1mdW5jdGlvbiBLZShuLHQsZSxyKXt2YXIgdT1uZXcgR2Uobix0KTtyZXR1cm4gcmwucHVzaCh1KSxlJiZucih1LG4sdCxlKSxyJiZucih1LHQsbixyKSx1bFtuLmldLmVkZ2VzLnB1c2gobmV3IHRyKHUsbix0KSksdWxbdC5pXS5lZGdlcy5wdXNoKG5ldyB0cih1LHQsbikpLHV9ZnVuY3Rpb24gUWUobix0LGUpe3ZhciByPW5ldyBHZShuLG51bGwpO3JldHVybiByLmE9dCxyLmI9ZSxybC5wdXNoKHIpLHJ9ZnVuY3Rpb24gbnIobix0LGUscil7bi5hfHxuLmI/bi5sPT09ZT9uLmI9cjpuLmE9cjoobi5hPXIsbi5sPXQsbi5yPWUpfWZ1bmN0aW9uIHRyKG4sdCxlKXt2YXIgcj1uLmEsdT1uLmI7dGhpcy5lZGdlPW4sdGhpcy5zaXRlPXQsdGhpcy5hbmdsZT1lP01hdGguYXRhbjIoZS55LXQueSxlLngtdC54KTpuLmw9PT10P01hdGguYXRhbjIodS54LXIueCxyLnktdS55KTpNYXRoLmF0YW4yKHIueC11LngsdS55LXIueSl9ZnVuY3Rpb24gZXIoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBycihuKXtuLlU9bi5DPW4uTD1uLlI9bi5QPW4uTj1udWxsfWZ1bmN0aW9uIHVyKG4sdCl7dmFyIGU9dCxyPXQuUix1PWUuVTt1P3UuTD09PWU/dS5MPXI6dS5SPXI6bi5fPXIsci5VPXUsZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiBpcihuLHQpe3ZhciBlPXQscj10LkwsdT1lLlU7dT91Lkw9PT1lP3UuTD1yOnUuUj1yOm4uXz1yLHIuVT11LGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gYXIobil7Zm9yKDtuLkw7KW49bi5MO3JldHVybiBufWZ1bmN0aW9uIG9yKG4sdCl7dmFyIGUscix1LGk9bi5zb3J0KGxyKS5wb3AoKTtmb3Iocmw9W10sdWw9bmV3IEFycmF5KG4ubGVuZ3RoKSxpbD1uZXcgZXIsb2w9bmV3IGVyOzspaWYodT1hbCxpJiYoIXV8fGkueTx1Lnl8fGkueT09PXUueSYmaS54PHUueCkpKGkueCE9PWV8fGkueSE9PXIpJiYodWxbaS5pXT1uZXcgWWUoaSksSGUoaSksZT1pLngscj1pLnkpLGk9bi5wb3AoKTtlbHNle2lmKCF1KWJyZWFrO0ZlKHUuYXJjKX10JiYoV2UodCksWmUodCkpO3ZhciBhPXtjZWxsczp1bCxlZGdlczpybH07cmV0dXJuIGlsPW9sPXJsPXVsPW51bGwsYX1mdW5jdGlvbiBscihuLHQpe3JldHVybiB0Lnktbi55fHx0Lngtbi54fWZ1bmN0aW9uIGNyKG4sdCxlKXtyZXR1cm4obi54LWUueCkqKHQueS1uLnkpLShuLngtdC54KSooZS55LW4ueSl9ZnVuY3Rpb24gc3Iobil7cmV0dXJuIG4ueH1mdW5jdGlvbiBmcihuKXtyZXR1cm4gbi55fWZ1bmN0aW9uIGhyKCl7cmV0dXJue2xlYWY6ITAsbm9kZXM6W10scG9pbnQ6bnVsbCx4Om51bGwseTpudWxsfX1mdW5jdGlvbiBncihuLHQsZSxyLHUsaSl7aWYoIW4odCxlLHIsdSxpKSl7dmFyIGE9LjUqKGUrdSksbz0uNSoocitpKSxsPXQubm9kZXM7bFswXSYmZ3IobixsWzBdLGUscixhLG8pLGxbMV0mJmdyKG4sbFsxXSxhLHIsdSxvKSxsWzJdJiZncihuLGxbMl0sZSxvLGEsaSksbFszXSYmZ3IobixsWzNdLGEsbyx1LGkpfX1mdW5jdGlvbiBwcihuLHQsZSxyLHUsaSxhKXt2YXIgbyxsPTEvMDtyZXR1cm4gZnVuY3Rpb24gYyhuLHMsZixoLGcpe2lmKCEocz5pfHxmPmF8fHI+aHx8dT5nKSl7aWYocD1uLnBvaW50KXt2YXIgcCx2PXQtbi54LGQ9ZS1uLnksbT12KnYrZCpkO2lmKGw+bSl7dmFyIHk9TWF0aC5zcXJ0KGw9bSk7cj10LXksdT1lLXksaT10K3ksYT1lK3ksbz1wfX1mb3IodmFyIE09bi5ub2Rlcyx4PS41KihzK2gpLGI9LjUqKGYrZyksXz10Pj14LHc9ZT49YixTPXc8PDF8XyxrPVMrNDtrPlM7KytTKWlmKG49TVszJlNdKXN3aXRjaCgzJlMpe2Nhc2UgMDpjKG4scyxmLHgsYik7YnJlYWs7Y2FzZSAxOmMobix4LGYsaCxiKTticmVhaztjYXNlIDI6YyhuLHMsYix4LGcpO2JyZWFrO2Nhc2UgMzpjKG4seCxiLGgsZyl9fX0obixyLHUsaSxhKSxvfWZ1bmN0aW9uIHZyKG4sdCl7bj1vYS5yZ2IobiksdD1vYS5yZ2IodCk7dmFyIGU9bi5yLHI9bi5nLHU9bi5iLGk9dC5yLWUsYT10LmctcixvPXQuYi11O3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4iIyIrYm4oTWF0aC5yb3VuZChlK2kqbikpK2JuKE1hdGgucm91bmQocithKm4pKStibihNYXRoLnJvdW5kKHUrbypuKSl9fWZ1bmN0aW9uIGRyKG4sdCl7dmFyIGUscj17fSx1PXt9O2ZvcihlIGluIG4pZSBpbiB0P3JbZV09TXIobltlXSx0W2VdKTp1W2VdPW5bZV07Zm9yKGUgaW4gdCllIGluIG58fCh1W2VdPXRbZV0pO3JldHVybiBmdW5jdGlvbihuKXtmb3IoZSBpbiByKXVbZV09cltlXShuKTtyZXR1cm4gdX19ZnVuY3Rpb24gbXIobix0KXtyZXR1cm4gbj0rbix0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBuKigxLWUpK3QqZX19ZnVuY3Rpb24geXIobix0KXt2YXIgZSxyLHUsaT1mbC5sYXN0SW5kZXg9aGwubGFzdEluZGV4PTAsYT0tMSxvPVtdLGw9W107Zm9yKG4rPSIiLHQrPSIiOyhlPWZsLmV4ZWMobikpJiYocj1obC5leGVjKHQpKTspKHU9ci5pbmRleCk+aSYmKHU9dC5zbGljZShpLHUpLG9bYV0/b1thXSs9dTpvWysrYV09dSksKGU9ZVswXSk9PT0ocj1yWzBdKT9vW2FdP29bYV0rPXI6b1srK2FdPXI6KG9bKythXT1udWxsLGwucHVzaCh7aTphLHg6bXIoZSxyKX0pKSxpPWhsLmxhc3RJbmRleDtyZXR1cm4gaTx0Lmxlbmd0aCYmKHU9dC5zbGljZShpKSxvW2FdP29bYV0rPXU6b1srK2FdPXUpLG8ubGVuZ3RoPDI/bFswXT8odD1sWzBdLngsZnVuY3Rpb24obil7cmV0dXJuIHQobikrIiJ9KTpmdW5jdGlvbigpe3JldHVybiB0fToodD1sLmxlbmd0aCxmdW5jdGlvbihuKXtmb3IodmFyIGUscj0wO3Q+cjsrK3Ipb1soZT1sW3JdKS5pXT1lLngobik7cmV0dXJuIG8uam9pbigiIil9KX1mdW5jdGlvbiBNcihuLHQpe2Zvcih2YXIgZSxyPW9hLmludGVycG9sYXRvcnMubGVuZ3RoOy0tcj49MCYmIShlPW9hLmludGVycG9sYXRvcnNbcl0obix0KSk7KTtyZXR1cm4gZX1mdW5jdGlvbiB4cihuLHQpe3ZhciBlLHI9W10sdT1bXSxpPW4ubGVuZ3RoLGE9dC5sZW5ndGgsbz1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCk7Zm9yKGU9MDtvPmU7KytlKXIucHVzaChNcihuW2VdLHRbZV0pKTtmb3IoO2k+ZTsrK2UpdVtlXT1uW2VdO2Zvcig7YT5lOysrZSl1W2VdPXRbZV07cmV0dXJuIGZ1bmN0aW9uKG4pe2ZvcihlPTA7bz5lOysrZSl1W2VdPXJbZV0obik7cmV0dXJuIHV9fWZ1bmN0aW9uIGJyKG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMD49dD8wOnQ+PTE/MTpuKHQpfX1mdW5jdGlvbiBfcihuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDEtbigxLXQpfX1mdW5jdGlvbiB3cihuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuLjUqKC41PnQ/bigyKnQpOjItbigyLTIqdCkpfX1mdW5jdGlvbiBTcihuKXtyZXR1cm4gbipufWZ1bmN0aW9uIGtyKG4pe3JldHVybiBuKm4qbn1mdW5jdGlvbiBOcihuKXtpZigwPj1uKXJldHVybiAwO2lmKG4+PTEpcmV0dXJuIDE7dmFyIHQ9bipuLGU9dCpuO3JldHVybiA0KiguNT5uP2U6Myoobi10KStlLS43NSl9ZnVuY3Rpb24gRXIobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBBcihuKXtyZXR1cm4gMS1NYXRoLmNvcyhuKkhhKX1mdW5jdGlvbiBDcihuKXtyZXR1cm4gTWF0aC5wb3coMiwxMCoobi0xKSl9ZnVuY3Rpb24genIobil7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtbipuKX1mdW5jdGlvbiBMcihuLHQpe3ZhciBlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PS40NSksYXJndW1lbnRzLmxlbmd0aD9lPXQvamEqTWF0aC5hc2luKDEvbik6KG49MSxlPXQvNCksZnVuY3Rpb24ocil7cmV0dXJuIDErbipNYXRoLnBvdygyLC0xMCpyKSpNYXRoLnNpbigoci1lKSpqYS90KX19ZnVuY3Rpb24gcXIobil7cmV0dXJuIG58fChuPTEuNzAxNTgpLGZ1bmN0aW9uKHQpe3JldHVybiB0KnQqKChuKzEpKnQtbil9fWZ1bmN0aW9uIFRyKG4pe3JldHVybiAxLzIuNzU+bj83LjU2MjUqbipuOjIvMi43NT5uPzcuNTYyNSoobi09MS41LzIuNzUpKm4rLjc1OjIuNS8yLjc1Pm4/Ny41NjI1KihuLT0yLjI1LzIuNzUpKm4rLjkzNzU6Ny41NjI1KihuLT0yLjYyNS8yLjc1KSpuKy45ODQzNzV9ZnVuY3Rpb24gUnIobix0KXtuPW9hLmhjbChuKSx0PW9hLmhjbCh0KTt2YXIgZT1uLmgscj1uLmMsdT1uLmwsaT10LmgtZSxhPXQuYy1yLG89dC5sLXU7cmV0dXJuIGlzTmFOKGEpJiYoYT0wLHI9aXNOYU4ocik/dC5jOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIGZuKGUraSpuLHIrYSpuLHUrbypuKSsiIn19ZnVuY3Rpb24gRHIobix0KXtuPW9hLmhzbChuKSx0PW9hLmhzbCh0KTt2YXIgZT1uLmgscj1uLnMsdT1uLmwsaT10LmgtZSxhPXQucy1yLG89dC5sLXU7cmV0dXJuIGlzTmFOKGEpJiYoYT0wLHI9aXNOYU4ocik/dC5zOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIGNuKGUraSpuLHIrYSpuLHUrbypuKSsiIn19ZnVuY3Rpb24gUHIobix0KXtuPW9hLmxhYihuKSx0PW9hLmxhYih0KTt2YXIgZT1uLmwscj1uLmEsdT1uLmIsaT10LmwtZSxhPXQuYS1yLG89dC5iLXU7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBnbihlK2kqbixyK2Eqbix1K28qbikrIiJ9fWZ1bmN0aW9uIFVyKG4sdCl7cmV0dXJuIHQtPW4sZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQobit0KmUpfX1mdW5jdGlvbiBqcihuKXt2YXIgdD1bbi5hLG4uYl0sZT1bbi5jLG4uZF0scj1Icih0KSx1PUZyKHQsZSksaT1IcihPcihlLHQsLXUpKXx8MDt0WzBdKmVbMV08ZVswXSp0WzFdJiYodFswXSo9LTEsdFsxXSo9LTEscio9LTEsdSo9LTEpLHRoaXMucm90YXRlPShyP01hdGguYXRhbjIodFsxXSx0WzBdKTpNYXRoLmF0YW4yKC1lWzBdLGVbMV0pKSpJYSx0aGlzLnRyYW5zbGF0ZT1bbi5lLG4uZl0sdGhpcy5zY2FsZT1bcixpXSx0aGlzLnNrZXc9aT9NYXRoLmF0YW4yKHUsaSkqSWE6MH1mdW5jdGlvbiBGcihuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdfWZ1bmN0aW9uIEhyKG4pe3ZhciB0PU1hdGguc3FydChGcihuLG4pKTtyZXR1cm4gdCYmKG5bMF0vPXQsblsxXS89dCksdH1mdW5jdGlvbiBPcihuLHQsZSl7cmV0dXJuIG5bMF0rPWUqdFswXSxuWzFdKz1lKnRbMV0sbn1mdW5jdGlvbiBJcihuKXtyZXR1cm4gbi5sZW5ndGg/bi5wb3AoKSsiLCI6IiJ9ZnVuY3Rpb24gWXIobix0LGUscil7aWYoblswXSE9PXRbMF18fG5bMV0hPT10WzFdKXt2YXIgdT1lLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsIiwiLG51bGwsIikiKTtyLnB1c2goe2k6dS00LHg6bXIoblswXSx0WzBdKX0se2k6dS0yLHg6bXIoblsxXSx0WzFdKX0pfWVsc2UodFswXXx8dFsxXSkmJmUucHVzaCgidHJhbnNsYXRlKCIrdCsiKSIpfWZ1bmN0aW9uIFpyKG4sdCxlLHIpe24hPT10PyhuLXQ+MTgwP3QrPTM2MDp0LW4+MTgwJiYobis9MzYwKSxyLnB1c2goe2k6ZS5wdXNoKElyKGUpKyJyb3RhdGUoIixudWxsLCIpIiktMix4Om1yKG4sdCl9KSk6dCYmZS5wdXNoKElyKGUpKyJyb3RhdGUoIit0KyIpIil9ZnVuY3Rpb24gVnIobix0LGUscil7biE9PXQ/ci5wdXNoKHtpOmUucHVzaChJcihlKSsic2tld1goIixudWxsLCIpIiktMix4Om1yKG4sdCl9KTp0JiZlLnB1c2goSXIoZSkrInNrZXdYKCIrdCsiKSIpfWZ1bmN0aW9uIFhyKG4sdCxlLHIpe2lmKG5bMF0hPT10WzBdfHxuWzFdIT09dFsxXSl7dmFyIHU9ZS5wdXNoKElyKGUpKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTtyLnB1c2goe2k6dS00LHg6bXIoblswXSx0WzBdKX0se2k6dS0yLHg6bXIoblsxXSx0WzFdKX0pfWVsc2UoMSE9PXRbMF18fDEhPT10WzFdKSYmZS5wdXNoKElyKGUpKyJzY2FsZSgiK3QrIikiKX1mdW5jdGlvbiAkcihuLHQpe3ZhciBlPVtdLHI9W107cmV0dXJuIG49b2EudHJhbnNmb3JtKG4pLHQ9b2EudHJhbnNmb3JtKHQpLFlyKG4udHJhbnNsYXRlLHQudHJhbnNsYXRlLGUsciksWnIobi5yb3RhdGUsdC5yb3RhdGUsZSxyKSxWcihuLnNrZXcsdC5za2V3LGUsciksWHIobi5zY2FsZSx0LnNjYWxlLGUsciksbj10PW51bGwsZnVuY3Rpb24obil7Zm9yKHZhciB0LHU9LTEsaT1yLmxlbmd0aDsrK3U8aTspZVsodD1yW3VdKS5pXT10Lngobik7cmV0dXJuIGUuam9pbigiIil9fWZ1bmN0aW9uIEJyKG4sdCl7cmV0dXJuIHQ9KHQtPW49K24pfHwxL3QsZnVuY3Rpb24oZSl7cmV0dXJuKGUtbikvdH19ZnVuY3Rpb24gV3Iobix0KXtyZXR1cm4gdD0odC09bj0rbil8fDEvdCxmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigxLChlLW4pL3QpKX19ZnVuY3Rpb24gSnIobil7Zm9yKHZhciB0PW4uc291cmNlLGU9bi50YXJnZXQscj1Lcih0LGUpLHU9W3RdO3QhPT1yOyl0PXQucGFyZW50LHUucHVzaCh0KTtmb3IodmFyIGk9dS5sZW5ndGg7ZSE9PXI7KXUuc3BsaWNlKGksMCxlKSxlPWUucGFyZW50O3JldHVybiB1fWZ1bmN0aW9uIEdyKG4pe2Zvcih2YXIgdD1bXSxlPW4ucGFyZW50O251bGwhPWU7KXQucHVzaChuKSxuPWUsZT1lLnBhcmVudDtyZXR1cm4gdC5wdXNoKG4pLHR9ZnVuY3Rpb24gS3Iobix0KXtpZihuPT09dClyZXR1cm4gbjtmb3IodmFyIGU9R3Iobikscj1Hcih0KSx1PWUucG9wKCksaT1yLnBvcCgpLGE9bnVsbDt1PT09aTspYT11LHU9ZS5wb3AoKSxpPXIucG9wKCk7cmV0dXJuIGF9ZnVuY3Rpb24gUXIobil7bi5maXhlZHw9Mn1mdW5jdGlvbiBudShuKXtuLmZpeGVkJj0tN31mdW5jdGlvbiB0dShuKXtuLmZpeGVkfD00LG4ucHg9bi54LG4ucHk9bi55fWZ1bmN0aW9uIGV1KG4pe24uZml4ZWQmPS01fWZ1bmN0aW9uIHJ1KG4sdCxlKXt2YXIgcj0wLHU9MDtpZihuLmNoYXJnZT0wLCFuLmxlYWYpZm9yKHZhciBpLGE9bi5ub2RlcyxvPWEubGVuZ3RoLGw9LTE7KytsPG87KWk9YVtsXSxudWxsIT1pJiYocnUoaSx0LGUpLG4uY2hhcmdlKz1pLmNoYXJnZSxyKz1pLmNoYXJnZSppLmN4LHUrPWkuY2hhcmdlKmkuY3kpO2lmKG4ucG9pbnQpe24ubGVhZnx8KG4ucG9pbnQueCs9TWF0aC5yYW5kb20oKS0uNSxuLnBvaW50LnkrPU1hdGgucmFuZG9tKCktLjUpO3ZhciBjPXQqZVtuLnBvaW50LmluZGV4XTtuLmNoYXJnZSs9bi5wb2ludENoYXJnZT1jLHIrPWMqbi5wb2ludC54LHUrPWMqbi5wb2ludC55fW4uY3g9ci9uLmNoYXJnZSxuLmN5PXUvbi5jaGFyZ2V9ZnVuY3Rpb24gdXUobix0KXtyZXR1cm4gb2EucmViaW5kKG4sdCwic29ydCIsImNoaWxkcmVuIiwidmFsdWUiKSxuLm5vZGVzPW4sbi5saW5rcz1zdSxufWZ1bmN0aW9uIGl1KG4sdCl7Zm9yKHZhciBlPVtuXTtudWxsIT0obj1lLnBvcCgpKTspaWYodChuKSwodT1uLmNoaWxkcmVuKSYmKHI9dS5sZW5ndGgpKWZvcih2YXIgcix1Oy0tcj49MDspZS5wdXNoKHVbcl0pfWZ1bmN0aW9uIGF1KG4sdCl7Zm9yKHZhciBlPVtuXSxyPVtdO251bGwhPShuPWUucG9wKCkpOylpZihyLnB1c2gobiksKGk9bi5jaGlsZHJlbikmJih1PWkubGVuZ3RoKSlmb3IodmFyIHUsaSxhPS0xOysrYTx1OyllLnB1c2goaVthXSk7Zm9yKDtudWxsIT0obj1yLnBvcCgpKTspdChuKX1mdW5jdGlvbiBvdShuKXtyZXR1cm4gbi5jaGlsZHJlbn1mdW5jdGlvbiBsdShuKXtyZXR1cm4gbi52YWx1ZX1mdW5jdGlvbiBjdShuLHQpe3JldHVybiB0LnZhbHVlLW4udmFsdWV9ZnVuY3Rpb24gc3Uobil7cmV0dXJuIG9hLm1lcmdlKG4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybihuLmNoaWxkcmVufHxbXSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6bix0YXJnZXQ6dH19KX0pKX1mdW5jdGlvbiBmdShuKXtyZXR1cm4gbi54fWZ1bmN0aW9uIGh1KG4pe3JldHVybiBuLnl9ZnVuY3Rpb24gZ3Uobix0LGUpe24ueTA9dCxuLnk9ZX1mdW5jdGlvbiBwdShuKXtyZXR1cm4gb2EucmFuZ2Uobi5sZW5ndGgpfWZ1bmN0aW9uIHZ1KG4pe2Zvcih2YXIgdD0tMSxlPW5bMF0ubGVuZ3RoLHI9W107Kyt0PGU7KXJbdF09MDtyZXR1cm4gcn1mdW5jdGlvbiBkdShuKXtmb3IodmFyIHQsZT0xLHI9MCx1PW5bMF1bMV0saT1uLmxlbmd0aDtpPmU7KytlKSh0PW5bZV1bMV0pPnUmJihyPWUsdT10KTtyZXR1cm4gcn1mdW5jdGlvbiBtdShuKXtyZXR1cm4gbi5yZWR1Y2UoeXUsMCl9ZnVuY3Rpb24geXUobix0KXtyZXR1cm4gbit0WzFdfWZ1bmN0aW9uIE11KG4sdCl7cmV0dXJuIHh1KG4sTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMisxKSl9ZnVuY3Rpb24geHUobix0KXtmb3IodmFyIGU9LTEscj0rblswXSx1PShuWzFdLXIpL3QsaT1bXTsrK2U8PXQ7KWlbZV09dSplK3I7cmV0dXJuIGl9ZnVuY3Rpb24gYnUobil7cmV0dXJuW29hLm1pbihuKSxvYS5tYXgobildfWZ1bmN0aW9uIF91KG4sdCl7cmV0dXJuIG4udmFsdWUtdC52YWx1ZX1mdW5jdGlvbiB3dShuLHQpe3ZhciBlPW4uX3BhY2tfbmV4dDtuLl9wYWNrX25leHQ9dCx0Ll9wYWNrX3ByZXY9bix0Ll9wYWNrX25leHQ9ZSxlLl9wYWNrX3ByZXY9dH1mdW5jdGlvbiBTdShuLHQpe24uX3BhY2tfbmV4dD10LHQuX3BhY2tfcHJldj1ufWZ1bmN0aW9uIGt1KG4sdCl7dmFyIGU9dC54LW4ueCxyPXQueS1uLnksdT1uLnIrdC5yO3JldHVybi45OTkqdSp1PmUqZStyKnJ9ZnVuY3Rpb24gTnUobil7ZnVuY3Rpb24gdChuKXtzPU1hdGgubWluKG4ueC1uLnIscyksZj1NYXRoLm1heChuLngrbi5yLGYpLGg9TWF0aC5taW4obi55LW4ucixoKSxnPU1hdGgubWF4KG4ueStuLnIsZyl9aWYoKGU9bi5jaGlsZHJlbikmJihjPWUubGVuZ3RoKSl7dmFyIGUscix1LGksYSxvLGwsYyxzPTEvMCxmPS0oMS8wKSxoPTEvMCxnPS0oMS8wKTtpZihlLmZvckVhY2goRXUpLHI9ZVswXSxyLng9LXIucixyLnk9MCx0KHIpLGM+MSYmKHU9ZVsxXSx1Lng9dS5yLHUueT0wLHQodSksYz4yKSlmb3IoaT1lWzJdLHp1KHIsdSxpKSx0KGkpLHd1KHIsaSksci5fcGFja19wcmV2PWksd3UoaSx1KSx1PXIuX3BhY2tfbmV4dCxhPTM7Yz5hO2ErKyl7enUocix1LGk9ZVthXSk7dmFyIHA9MCx2PTEsZD0xO2ZvcihvPXUuX3BhY2tfbmV4dDtvIT09dTtvPW8uX3BhY2tfbmV4dCx2KyspaWYoa3UobyxpKSl7cD0xO2JyZWFrfWlmKDE9PXApZm9yKGw9ci5fcGFja19wcmV2O2whPT1vLl9wYWNrX3ByZXYmJiFrdShsLGkpO2w9bC5fcGFja19wcmV2LGQrKyk7cD8oZD52fHx2PT1kJiZ1LnI8ci5yP1N1KHIsdT1vKTpTdShyPWwsdSksYS0tKTood3UocixpKSx1PWksdChpKSl9dmFyIG09KHMrZikvMix5PShoK2cpLzIsTT0wO2ZvcihhPTA7Yz5hO2ErKylpPWVbYV0saS54LT1tLGkueS09eSxNPU1hdGgubWF4KE0saS5yK01hdGguc3FydChpLngqaS54K2kueSppLnkpKTtuLnI9TSxlLmZvckVhY2goQXUpfX1mdW5jdGlvbiBFdShuKXtuLl9wYWNrX25leHQ9bi5fcGFja19wcmV2PW59ZnVuY3Rpb24gQXUobil7ZGVsZXRlIG4uX3BhY2tfbmV4dCxkZWxldGUgbi5fcGFja19wcmV2fWZ1bmN0aW9uIEN1KG4sdCxlLHIpe3ZhciB1PW4uY2hpbGRyZW47aWYobi54PXQrPXIqbi54LG4ueT1lKz1yKm4ueSxuLnIqPXIsdSlmb3IodmFyIGk9LTEsYT11Lmxlbmd0aDsrK2k8YTspQ3UodVtpXSx0LGUscil9ZnVuY3Rpb24genUobix0LGUpe3ZhciByPW4ucitlLnIsdT10Lngtbi54LGk9dC55LW4ueTtpZihyJiYodXx8aSkpe3ZhciBhPXQucitlLnIsbz11KnUraSppO2EqPWEscio9cjt2YXIgbD0uNSsoci1hKS8oMipvKSxjPU1hdGguc3FydChNYXRoLm1heCgwLDIqYSoocitvKS0oci09bykqci1hKmEpKS8oMipvKTtlLng9bi54K2wqdStjKmksZS55PW4ueStsKmktYyp1fWVsc2UgZS54PW4ueCtyLGUueT1uLnl9ZnVuY3Rpb24gTHUobix0KXtyZXR1cm4gbi5wYXJlbnQ9PXQucGFyZW50PzE6Mn1mdW5jdGlvbiBxdShuKXt2YXIgdD1uLmNoaWxkcmVuO3JldHVybiB0Lmxlbmd0aD90WzBdOm4udH1mdW5jdGlvbiBUdShuKXt2YXIgdCxlPW4uY2hpbGRyZW47cmV0dXJuKHQ9ZS5sZW5ndGgpP2VbdC0xXTpuLnR9ZnVuY3Rpb24gUnUobix0LGUpe3ZhciByPWUvKHQuaS1uLmkpO3QuYy09cix0LnMrPWUsbi5jKz1yLHQueis9ZSx0Lm0rPWV9ZnVuY3Rpb24gRHUobil7Zm9yKHZhciB0LGU9MCxyPTAsdT1uLmNoaWxkcmVuLGk9dS5sZW5ndGg7LS1pPj0wOyl0PXVbaV0sdC56Kz1lLHQubSs9ZSxlKz10LnMrKHIrPXQuYyl9ZnVuY3Rpb24gUHUobix0LGUpe3JldHVybiBuLmEucGFyZW50PT09dC5wYXJlbnQ/bi5hOmV9ZnVuY3Rpb24gVXUobil7cmV0dXJuIDErb2EubWF4KG4sZnVuY3Rpb24obil7cmV0dXJuIG4ueX0pfWZ1bmN0aW9uIGp1KG4pe3JldHVybiBuLnJlZHVjZShmdW5jdGlvbihuLHQpe3JldHVybiBuK3QueH0sMCkvbi5sZW5ndGh9ZnVuY3Rpb24gRnUobil7dmFyIHQ9bi5jaGlsZHJlbjtyZXR1cm4gdCYmdC5sZW5ndGg/RnUodFswXSk6bn1mdW5jdGlvbiBIdShuKXt2YXIgdCxlPW4uY2hpbGRyZW47cmV0dXJuIGUmJih0PWUubGVuZ3RoKT9IdShlW3QtMV0pOm59ZnVuY3Rpb24gT3Uobil7cmV0dXJue3g6bi54LHk6bi55LGR4Om4uZHgsZHk6bi5keX19ZnVuY3Rpb24gSXUobix0KXt2YXIgZT1uLngrdFszXSxyPW4ueSt0WzBdLHU9bi5keC10WzFdLXRbM10saT1uLmR5LXRbMF0tdFsyXTtyZXR1cm4gMD51JiYoZSs9dS8yLHU9MCksMD5pJiYocis9aS8yLGk9MCkse3g6ZSx5OnIsZHg6dSxkeTppfX1mdW5jdGlvbiBZdShuKXt2YXIgdD1uWzBdLGU9bltuLmxlbmd0aC0xXTtyZXR1cm4gZT50P1t0LGVdOltlLHRdfWZ1bmN0aW9uIFp1KG4pe3JldHVybiBuLnJhbmdlRXh0ZW50P24ucmFuZ2VFeHRlbnQoKTpZdShuLnJhbmdlKCkpfWZ1bmN0aW9uIFZ1KG4sdCxlLHIpe3ZhciB1PWUoblswXSxuWzFdKSxpPXIodFswXSx0WzFdKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGkodShuKSl9fWZ1bmN0aW9uIFh1KG4sdCl7dmFyIGUscj0wLHU9bi5sZW5ndGgtMSxpPW5bcl0sYT1uW3VdO3JldHVybiBpPmEmJihlPXIscj11LHU9ZSxlPWksaT1hLGE9ZSksbltyXT10LmZsb29yKGkpLG5bdV09dC5jZWlsKGEpLG59ZnVuY3Rpb24gJHUobil7cmV0dXJuIG4/e2Zsb29yOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmZsb29yKHQvbikqbn0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5jZWlsKHQvbikqbn19OndsfWZ1bmN0aW9uIEJ1KG4sdCxlLHIpe3ZhciB1PVtdLGk9W10sYT0wLG89TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpLTE7Zm9yKG5bb108blswXSYmKG49bi5zbGljZSgpLnJldmVyc2UoKSx0PXQuc2xpY2UoKS5yZXZlcnNlKCkpOysrYTw9bzspdS5wdXNoKGUoblthLTFdLG5bYV0pKSxpLnB1c2gocih0W2EtMV0sdFthXSkpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1vYS5iaXNlY3Qobix0LDEsbyktMTtyZXR1cm4gaVtlXSh1W2VdKHQpKX19ZnVuY3Rpb24gV3Uobix0LGUscil7ZnVuY3Rpb24gdSgpe3ZhciB1PU1hdGgubWluKG4ubGVuZ3RoLHQubGVuZ3RoKT4yP0J1OlZ1LGw9cj9XcjpCcjtyZXR1cm4gYT11KG4sdCxsLGUpLG89dSh0LG4sbCxNciksaX1mdW5jdGlvbiBpKG4pe3JldHVybiBhKG4pfXZhciBhLG87cmV0dXJuIGkuaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiBvKG4pfSxpLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10Lm1hcChOdW1iZXIpLHUoKSk6bn0saS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLHUoKSk6dH0saS5yYW5nZVJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBpLnJhbmdlKG4pLmludGVycG9sYXRlKFVyKX0saS5jbGFtcD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHUoKSk6cn0saS5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHUoKSk6ZX0saS50aWNrcz1mdW5jdGlvbih0KXtyZXR1cm4gUXUobix0KX0saS50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5pKG4sdCxlKX0saS5uaWNlPWZ1bmN0aW9uKHQpe3JldHVybiBHdShuLHQpLHUoKX0saS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFd1KG4sdCxlLHIpfSx1KCl9ZnVuY3Rpb24gSnUobix0KXtyZXR1cm4gb2EucmViaW5kKG4sdCwicmFuZ2UiLCJyYW5nZVJvdW5kIiwiaW50ZXJwb2xhdGUiLCJjbGFtcCIpfWZ1bmN0aW9uIEd1KG4sdCl7cmV0dXJuIFh1KG4sJHUoS3Uobix0KVsyXSkpLFh1KG4sJHUoS3Uobix0KVsyXSkpLG59ZnVuY3Rpb24gS3Uobix0KXtudWxsPT10JiYodD0xMCk7dmFyIGU9WXUobikscj1lWzFdLWVbMF0sdT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIvdCkvTWF0aC5MTjEwKSksaT10L3IqdTtyZXR1cm4uMTU+PWk/dSo9MTA6LjM1Pj1pP3UqPTU6Ljc1Pj1pJiYodSo9MiksZVswXT1NYXRoLmNlaWwoZVswXS91KSp1LGVbMV09TWF0aC5mbG9vcihlWzFdL3UpKnUrLjUqdSxlWzJdPXUsZX1mdW5jdGlvbiBRdShuLHQpe3JldHVybiBvYS5yYW5nZS5hcHBseShvYSxLdShuLHQpKX1mdW5jdGlvbiBuaShuLHQsZSl7dmFyIHI9S3Uobix0KTtpZihlKXt2YXIgdT1zby5leGVjKGUpO2lmKHUuc2hpZnQoKSwicyI9PT11WzhdKXt2YXIgaT1vYS5mb3JtYXRQcmVmaXgoTWF0aC5tYXgoTWEoclswXSksTWEoclsxXSkpKTtyZXR1cm4gdVs3XXx8KHVbN109Ii4iK3RpKGkuc2NhbGUoclsyXSkpKSx1WzhdPSJmIixlPW9hLmZvcm1hdCh1LmpvaW4oIiIpKSxmdW5jdGlvbihuKXtyZXR1cm4gZShpLnNjYWxlKG4pKStpLnN5bWJvbH19dVs3XXx8KHVbN109Ii4iK2VpKHVbOF0scikpLGU9dS5qb2luKCIiKX1lbHNlIGU9IiwuIit0aShyWzJdKSsiZiI7cmV0dXJuIG9hLmZvcm1hdChlKX1mdW5jdGlvbiB0aShuKXtyZXR1cm4tTWF0aC5mbG9vcihNYXRoLmxvZyhuKS9NYXRoLkxOMTArLjAxKX1mdW5jdGlvbiBlaShuLHQpe3ZhciBlPXRpKHRbMl0pO3JldHVybiBuIGluIFNsP01hdGguYWJzKGUtdGkoTWF0aC5tYXgoTWEodFswXSksTWEodFsxXSkpKSkrICsoImUiIT09bik6ZS0yKigiJSI9PT1uKX1mdW5jdGlvbiByaShuLHQsZSxyKXtmdW5jdGlvbiB1KG4pe3JldHVybihlP01hdGgubG9nKDA+bj8wOm4pOi1NYXRoLmxvZyhuPjA/MDotbikpL01hdGgubG9nKHQpfWZ1bmN0aW9uIGkobil7cmV0dXJuIGU/TWF0aC5wb3codCxuKTotTWF0aC5wb3codCwtbil9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gbih1KHQpKX1yZXR1cm4gYS5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGkobi5pbnZlcnQodCkpfSxhLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10WzBdPj0wLG4uZG9tYWluKChyPXQubWFwKE51bWJlcikpLm1hcCh1KSksYSk6cn0sYS5iYXNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStlLG4uZG9tYWluKHIubWFwKHUpKSxhKTp0fSxhLm5pY2U9ZnVuY3Rpb24oKXt2YXIgdD1YdShyLm1hcCh1KSxlP01hdGg6TmwpO3JldHVybiBuLmRvbWFpbih0KSxyPXQubWFwKGkpLGF9LGEudGlja3M9ZnVuY3Rpb24oKXt2YXIgbj1ZdShyKSxhPVtdLG89blswXSxsPW5bMV0sYz1NYXRoLmZsb29yKHUobykpLHM9TWF0aC5jZWlsKHUobCkpLGY9dCUxPzI6dDtpZihpc0Zpbml0ZShzLWMpKXtpZihlKXtmb3IoO3M+YztjKyspZm9yKHZhciBoPTE7Zj5oO2grKylhLnB1c2goaShjKSpoKTthLnB1c2goaShjKSl9ZWxzZSBmb3IoYS5wdXNoKGkoYykpO2MrKzxzOylmb3IodmFyIGg9Zi0xO2g+MDtoLS0pYS5wdXNoKGkoYykqaCk7Zm9yKGM9MDthW2NdPG87YysrKTtmb3Iocz1hLmxlbmd0aDthW3MtMV0+bDtzLS0pO2E9YS5zbGljZShjLHMpfXJldHVybiBhfSxhLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4ga2w7YXJndW1lbnRzLmxlbmd0aDwyP2U9a2w6ImZ1bmN0aW9uIiE9dHlwZW9mIGUmJihlPW9hLmZvcm1hdChlKSk7dmFyIHI9TWF0aC5tYXgoMSx0Km4vYS50aWNrcygpLmxlbmd0aCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBhPW4vaShNYXRoLnJvdW5kKHUobikpKTtyZXR1cm4gdC0uNT5hKnQmJihhKj10KSxyPj1hP2Uobik6IiJ9fSxhLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gcmkobi5jb3B5KCksdCxlLHIpfSxKdShhLG4pfWZ1bmN0aW9uIHVpKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBuKHUodCkpfXZhciB1PWlpKHQpLGk9aWkoMS90KTtyZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGkobi5pbnZlcnQodCkpfSxyLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obi5kb21haW4oKGU9dC5tYXAoTnVtYmVyKSkubWFwKHUpKSxyKTplfSxyLnRpY2tzPWZ1bmN0aW9uKG4pe3JldHVybiBRdShlLG4pfSxyLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gbmkoZSxuLHQpfSxyLm5pY2U9ZnVuY3Rpb24obil7cmV0dXJuIHIuZG9tYWluKEd1KGUsbikpfSxyLmV4cG9uZW50PWZ1bmN0aW9uKGEpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWlpKHQ9YSksaT1paSgxL3QpLG4uZG9tYWluKGUubWFwKHUpKSxyKTp0fSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdWkobi5jb3B5KCksdCxlKX0sSnUocixuKX1mdW5jdGlvbiBpaShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDA+dD8tTWF0aC5wb3coLXQsbik6TWF0aC5wb3codCxuKX19ZnVuY3Rpb24gYWkobix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiBpWygodS5nZXQoZSl8fCgicmFuZ2UiPT09dC50P3Uuc2V0KGUsbi5wdXNoKGUpKTpOYU4pKS0xKSVpLmxlbmd0aF19ZnVuY3Rpb24gcih0LGUpe3JldHVybiBvYS5yYW5nZShuLmxlbmd0aCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiB0K2Uqbn0pfXZhciB1LGksYTtyZXR1cm4gZS5kb21haW49ZnVuY3Rpb24ocil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG47bj1bXSx1PW5ldyBjO2Zvcih2YXIgaSxhPS0xLG89ci5sZW5ndGg7KythPG87KXUuaGFzKGk9clthXSl8fHUuc2V0KGksbi5wdXNoKGkpKTtyZXR1cm4gZVt0LnRdLmFwcGx5KGUsdC5hKX0sZS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1uLGE9MCx0PXt0OiJyYW5nZSIsYTphcmd1bWVudHN9LGUpOml9LGUucmFuZ2VQb2ludHM9ZnVuY3Rpb24odSxvKXthcmd1bWVudHMubGVuZ3RoPDImJihvPTApO3ZhciBsPXVbMF0sYz11WzFdLHM9bi5sZW5ndGg8Mj8obD0obCtjKS8yLDApOihjLWwpLyhuLmxlbmd0aC0xK28pO3JldHVybiBpPXIobCtzKm8vMixzKSxhPTAsdD17dDoicmFuZ2VQb2ludHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlUm91bmRQb2ludHM9ZnVuY3Rpb24odSxvKXthcmd1bWVudHMubGVuZ3RoPDImJihvPTApO3ZhciBsPXVbMF0sYz11WzFdLHM9bi5sZW5ndGg8Mj8obD1jPU1hdGgucm91bmQoKGwrYykvMiksMCk6KGMtbCkvKG4ubGVuZ3RoLTErbyl8MDtyZXR1cm4gaT1yKGwrTWF0aC5yb3VuZChzKm8vMisoYy1sLShuLmxlbmd0aC0xK28pKnMpLzIpLHMpLGE9MCx0PXt0OiJyYW5nZVJvdW5kUG9pbnRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZUJhbmRzPWZ1bmN0aW9uKHUsbyxsKXthcmd1bWVudHMubGVuZ3RoPDImJihvPTApLGFyZ3VtZW50cy5sZW5ndGg8MyYmKGw9byk7dmFyIGM9dVsxXTx1WzBdLHM9dVtjLTBdLGY9dVsxLWNdLGg9KGYtcykvKG4ubGVuZ3RoLW8rMipsKTtyZXR1cm4gaT1yKHMraCpsLGgpLGMmJmkucmV2ZXJzZSgpLGE9aCooMS1vKSx0PXt0OiJyYW5nZUJhbmRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZVJvdW5kQmFuZHM9ZnVuY3Rpb24odSxvLGwpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKG89MCksYXJndW1lbnRzLmxlbmd0aDwzJiYobD1vKTt2YXIgYz11WzFdPHVbMF0scz11W2MtMF0sZj11WzEtY10saD1NYXRoLmZsb29yKChmLXMpLyhuLmxlbmd0aC1vKzIqbCkpO3JldHVybiBpPXIocytNYXRoLnJvdW5kKChmLXMtKG4ubGVuZ3RoLW8pKmgpLzIpLGgpLGMmJmkucmV2ZXJzZSgpLGE9TWF0aC5yb3VuZChoKigxLW8pKSx0PXt0OiJyYW5nZVJvdW5kQmFuZHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlQmFuZD1mdW5jdGlvbigpe3JldHVybiBhfSxlLnJhbmdlRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIFl1KHQuYVswXSl9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBhaShuLHQpfSxlLmRvbWFpbihuKX1mdW5jdGlvbiBvaShuLHQpe2Z1bmN0aW9uIGkoKXt2YXIgZT0wLHI9dC5sZW5ndGg7Zm9yKG89W107KytlPHI7KW9bZS0xXT1vYS5xdWFudGlsZShuLGUvcik7cmV0dXJuIGF9ZnVuY3Rpb24gYShuKXtyZXR1cm4gaXNOYU4obj0rbik/dm9pZCAwOnRbb2EuYmlzZWN0KG8sbildfXZhciBvO3JldHVybiBhLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10Lm1hcChyKS5maWx0ZXIodSkuc29ydChlKSxpKCkpOm59LGEucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixpKCkpOnR9LGEucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG99LGEuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlPXQuaW5kZXhPZihlKSwwPmU/W05hTixOYU5dOltlPjA/b1tlLTFdOm5bMF0sZTxvLmxlbmd0aD9vW2VdOm5bbi5sZW5ndGgtMV1dfSxhLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gb2kobix0KX0saSgpfWZ1bmN0aW9uIGxpKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBlW01hdGgubWF4KDAsTWF0aC5taW4oYSxNYXRoLmZsb29yKGkqKHQtbikpKSldfWZ1bmN0aW9uIHUoKXtyZXR1cm4gaT1lLmxlbmd0aC8odC1uKSxhPWUubGVuZ3RoLTEscn12YXIgaSxhO3JldHVybiByLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rZVswXSx0PStlW2UubGVuZ3RoLTFdLHUoKSk6W24sdF19LHIucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix1KCkpOmV9LHIuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0PWUuaW5kZXhPZih0KSx0PTA+dD9OYU46dC9pK24sW3QsdCsxL2ldfSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbGkobix0LGUpfSx1KCl9ZnVuY3Rpb24gY2kobix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiBlPj1lP3Rbb2EuYmlzZWN0KG4sZSldOnZvaWQgMH1yZXR1cm4gZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlKTpufSxlLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sZSk6dH0sZS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dC5pbmRleE9mKGUpLFtuW2UtMV0sbltlXV19LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBjaShuLHQpfSxlfWZ1bmN0aW9uIHNpKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuK259cmV0dXJuIHQuaW52ZXJ0PXQsdC5kb21haW49dC5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLm1hcCh0KSx0KTpufSx0LnRpY2tzPWZ1bmN0aW9uKHQpe3JldHVybiBRdShuLHQpfSx0LnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmkobix0LGUpfSx0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gc2kobil9LHR9ZnVuY3Rpb24gZmkoKXtyZXR1cm4gMH1mdW5jdGlvbiBoaShuKXtyZXR1cm4gbi5pbm5lclJhZGl1c31mdW5jdGlvbiBnaShuKXtyZXR1cm4gbi5vdXRlclJhZGl1c31mdW5jdGlvbiBwaShuKXtyZXR1cm4gbi5zdGFydEFuZ2xlfWZ1bmN0aW9uIHZpKG4pe3JldHVybiBuLmVuZEFuZ2xlfWZ1bmN0aW9uIGRpKG4pe3JldHVybiBuJiZuLnBhZEFuZ2xlfWZ1bmN0aW9uIG1pKG4sdCxlLHIpe3JldHVybihuLWUpKnQtKHQtcikqbj4wPzA6MX1mdW5jdGlvbiB5aShuLHQsZSxyLHUpe3ZhciBpPW5bMF0tdFswXSxhPW5bMV0tdFsxXSxvPSh1P3I6LXIpL01hdGguc3FydChpKmkrYSphKSxsPW8qYSxjPS1vKmkscz1uWzBdK2wsZj1uWzFdK2MsaD10WzBdK2wsZz10WzFdK2MscD0ocytoKS8yLHY9KGYrZykvMixkPWgtcyxtPWctZix5PWQqZCttKm0sTT1lLXIseD1zKmctaCpmLGI9KDA+bT8tMToxKSpNYXRoLnNxcnQoTWF0aC5tYXgoMCxNKk0qeS14KngpKSxfPSh4Km0tZCpiKS95LHc9KC14KmQtbSpiKS95LFM9KHgqbStkKmIpL3ksaz0oLXgqZCttKmIpL3ksTj1fLXAsRT13LXYsQT1TLXAsQz1rLXY7cmV0dXJuIE4qTitFKkU+QSpBK0MqQyYmKF89Uyx3PWspLFtbXy1sLHctY10sW18qZS9NLHcqZS9NXV19ZnVuY3Rpb24gTWkobil7ZnVuY3Rpb24gdCh0KXtmdW5jdGlvbiBhKCl7Yy5wdXNoKCJNIixpKG4ocyksbykpfWZvcih2YXIgbCxjPVtdLHM9W10sZj0tMSxoPXQubGVuZ3RoLGc9RW4oZSkscD1FbihyKTsrK2Y8aDspdS5jYWxsKHRoaXMsbD10W2ZdLGYpP3MucHVzaChbK2cuY2FsbCh0aGlzLGwsZiksK3AuY2FsbCh0aGlzLGwsZildKTpzLmxlbmd0aCYmKGEoKSxzPVtdKTtyZXR1cm4gcy5sZW5ndGgmJmEoKSxjLmxlbmd0aD9jLmpvaW4oIiIpOm51bGx9dmFyIGU9Q2Uscj16ZSx1PXp0LGk9eGksYT1pLmtleSxvPS43O3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyfSx0LmRlZmluZWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bix0KTp1fSx0LmludGVycG9sYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiBuP2k9bjooaT1xbC5nZXQobil8fHhpKS5rZXksdCk6YX0sdC50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sdCk6b30sdH1mdW5jdGlvbiB4aShuKXtyZXR1cm4gbi5sZW5ndGg+MT9uLmpvaW4oIkwiKTpuKyJaIn1mdW5jdGlvbiBiaShuKXtyZXR1cm4gbi5qb2luKCJMIikrIloifWZ1bmN0aW9uIF9pKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLHU9W3JbMF0sIiwiLHJbMV1dOysrdDxlOyl1LnB1c2goIkgiLChyWzBdKyhyPW5bdF0pWzBdKS8yLCJWIixyWzFdKTtyZXR1cm4gZT4xJiZ1LnB1c2goIkgiLHJbMF0pLHUuam9pbigiIil9ZnVuY3Rpb24gd2kobil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0sdT1bclswXSwiLCIsclsxXV07Kyt0PGU7KXUucHVzaCgiViIsKHI9blt0XSlbMV0sIkgiLHJbMF0pO3JldHVybiB1LmpvaW4oIiIpfWZ1bmN0aW9uIFNpKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLHU9W3JbMF0sIiwiLHJbMV1dOysrdDxlOyl1LnB1c2goIkgiLChyPW5bdF0pWzBdLCJWIixyWzFdKTtyZXR1cm4gdS5qb2luKCIiKX1mdW5jdGlvbiBraShuLHQpe3JldHVybiBuLmxlbmd0aDw0P3hpKG4pOm5bMV0rQWkobi5zbGljZSgxLC0xKSxDaShuLHQpKX1mdW5jdGlvbiBOaShuLHQpe3JldHVybiBuLmxlbmd0aDwzP2JpKG4pOm5bMF0rQWkoKG4ucHVzaChuWzBdKSxuKSxDaShbbltuLmxlbmd0aC0yXV0uY29uY2F0KG4sW25bMV1dKSx0KSl9ZnVuY3Rpb24gRWkobix0KXtyZXR1cm4gbi5sZW5ndGg8Mz94aShuKTpuWzBdK0FpKG4sQ2kobix0KSl9ZnVuY3Rpb24gQWkobix0KXtpZih0Lmxlbmd0aDwxfHxuLmxlbmd0aCE9dC5sZW5ndGgmJm4ubGVuZ3RoIT10Lmxlbmd0aCsyKXJldHVybiB4aShuKTt2YXIgZT1uLmxlbmd0aCE9dC5sZW5ndGgscj0iIix1PW5bMF0saT1uWzFdLGE9dFswXSxvPWEsbD0xO2lmKGUmJihyKz0iUSIrKGlbMF0tMiphWzBdLzMpKyIsIisoaVsxXS0yKmFbMV0vMykrIiwiK2lbMF0rIiwiK2lbMV0sdT1uWzFdLGw9MiksdC5sZW5ndGg+MSl7bz10WzFdLGk9bltsXSxsKysscis9IkMiKyh1WzBdK2FbMF0pKyIsIisodVsxXSthWzFdKSsiLCIrKGlbMF0tb1swXSkrIiwiKyhpWzFdLW9bMV0pKyIsIitpWzBdKyIsIitpWzFdO2Zvcih2YXIgYz0yO2M8dC5sZW5ndGg7YysrLGwrKylpPW5bbF0sbz10W2NdLHIrPSJTIisoaVswXS1vWzBdKSsiLCIrKGlbMV0tb1sxXSkrIiwiK2lbMF0rIiwiK2lbMV19aWYoZSl7dmFyIHM9bltsXTtyKz0iUSIrKGlbMF0rMipvWzBdLzMpKyIsIisoaVsxXSsyKm9bMV0vMykrIiwiK3NbMF0rIiwiK3NbMV19cmV0dXJuIHJ9ZnVuY3Rpb24gQ2kobix0KXtmb3IodmFyIGUscj1bXSx1PSgxLXQpLzIsaT1uWzBdLGE9blsxXSxvPTEsbD1uLmxlbmd0aDsrK288bDspZT1pLGk9YSxhPW5bb10sci5wdXNoKFt1KihhWzBdLWVbMF0pLHUqKGFbMV0tZVsxXSldKTtyZXR1cm4gcn1mdW5jdGlvbiB6aShuKXtpZihuLmxlbmd0aDwzKXJldHVybiB4aShuKTt2YXIgdD0xLGU9bi5sZW5ndGgscj1uWzBdLHU9clswXSxpPXJbMV0sYT1bdSx1LHUsKHI9blsxXSlbMF1dLG89W2ksaSxpLHJbMV1dLGw9W3UsIiwiLGksIkwiLFJpKERsLGEpLCIsIixSaShEbCxvKV07Zm9yKG4ucHVzaChuW2UtMV0pOysrdDw9ZTspcj1uW3RdLGEuc2hpZnQoKSxhLnB1c2goclswXSksby5zaGlmdCgpLG8ucHVzaChyWzFdKSxEaShsLGEsbyk7cmV0dXJuIG4ucG9wKCksbC5wdXNoKCJMIixyKSxsLmpvaW4oIiIpfWZ1bmN0aW9uIExpKG4pe2lmKG4ubGVuZ3RoPDQpcmV0dXJuIHhpKG4pO2Zvcih2YXIgdCxlPVtdLHI9LTEsdT1uLmxlbmd0aCxpPVswXSxhPVswXTsrK3I8MzspdD1uW3JdLGkucHVzaCh0WzBdKSxhLnB1c2godFsxXSk7Zm9yKGUucHVzaChSaShEbCxpKSsiLCIrUmkoRGwsYSkpLC0tcjsrK3I8dTspdD1uW3JdLGkuc2hpZnQoKSxpLnB1c2godFswXSksYS5zaGlmdCgpLGEucHVzaCh0WzFdKSxEaShlLGksYSk7cmV0dXJuIGUuam9pbigiIil9ZnVuY3Rpb24gcWkobil7Zm9yKHZhciB0LGUscj0tMSx1PW4ubGVuZ3RoLGk9dSs0LGE9W10sbz1bXTsrK3I8NDspZT1uW3IldV0sYS5wdXNoKGVbMF0pLG8ucHVzaChlWzFdKTtmb3IodD1bUmkoRGwsYSksIiwiLFJpKERsLG8pXSwtLXI7KytyPGk7KWU9bltyJXVdLGEuc2hpZnQoKSxhLnB1c2goZVswXSksby5zaGlmdCgpLG8ucHVzaChlWzFdKSxEaSh0LGEsbyk7cmV0dXJuIHQuam9pbigiIil9ZnVuY3Rpb24gVGkobix0KXt2YXIgZT1uLmxlbmd0aC0xO2lmKGUpZm9yKHZhciByLHUsaT1uWzBdWzBdLGE9blswXVsxXSxvPW5bZV1bMF0taSxsPW5bZV1bMV0tYSxjPS0xOysrYzw9ZTspcj1uW2NdLHU9Yy9lLHJbMF09dCpyWzBdKygxLXQpKihpK3UqbyksclsxXT10KnJbMV0rKDEtdCkqKGErdSpsKTtyZXR1cm4gemkobil9ZnVuY3Rpb24gUmkobix0KXtyZXR1cm4gblswXSp0WzBdK25bMV0qdFsxXStuWzJdKnRbMl0rblszXSp0WzNdfWZ1bmN0aW9uIERpKG4sdCxlKXtuLnB1c2goIkMiLFJpKFRsLHQpLCIsIixSaShUbCxlKSwiLCIsUmkoUmwsdCksIiwiLFJpKFJsLGUpLCIsIixSaShEbCx0KSwiLCIsUmkoRGwsZSkpfWZ1bmN0aW9uIFBpKG4sdCl7cmV0dXJuKHRbMV0tblsxXSkvKHRbMF0tblswXSl9ZnVuY3Rpb24gVWkobil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aC0xLHI9W10sdT1uWzBdLGk9blsxXSxhPXJbMF09UGkodSxpKTsrK3Q8ZTspclt0XT0oYSsoYT1QaSh1PWksaT1uW3QrMV0pKSkvMjtyZXR1cm4gclt0XT1hLHJ9ZnVuY3Rpb24gamkobil7Zm9yKHZhciB0LGUscix1LGk9W10sYT1VaShuKSxvPS0xLGw9bi5sZW5ndGgtMTsrK288bDspdD1QaShuW29dLG5bbysxXSksTWEodCk8RGE/YVtvXT1hW28rMV09MDooZT1hW29dL3Qscj1hW28rMV0vdCx1PWUqZStyKnIsdT45JiYodT0zKnQvTWF0aC5zcXJ0KHUpLGFbb109dSplLGFbbysxXT11KnIpKTtmb3Iobz0tMTsrK288PWw7KXU9KG5bTWF0aC5taW4obCxvKzEpXVswXS1uW01hdGgubWF4KDAsby0xKV1bMF0pLyg2KigxK2Fbb10qYVtvXSkpLGkucHVzaChbdXx8MCxhW29dKnV8fDBdKTtyZXR1cm4gaX1mdW5jdGlvbiBGaShuKXtyZXR1cm4gbi5sZW5ndGg8Mz94aShuKTpuWzBdK0FpKG4samkobikpfWZ1bmN0aW9uIEhpKG4pe2Zvcih2YXIgdCxlLHIsdT0tMSxpPW4ubGVuZ3RoOysrdTxpOyl0PW5bdV0sZT10WzBdLHI9dFsxXS1IYSx0WzBdPWUqTWF0aC5jb3MociksdFsxXT1lKk1hdGguc2luKHIpO3JldHVybiBufWZ1bmN0aW9uIE9pKG4pe2Z1bmN0aW9uIHQodCl7ZnVuY3Rpb24gbCgpe3YucHVzaCgiTSIsbyhuKG0pLGYpLHMsYyhuKGQucmV2ZXJzZSgpKSxmKSwiWiIpfWZvcih2YXIgaCxnLHAsdj1bXSxkPVtdLG09W10seT0tMSxNPXQubGVuZ3RoLHg9RW4oZSksYj1Fbih1KSxfPWU9PT1yP2Z1bmN0aW9uKCl7CnJldHVybiBnfTpFbihyKSx3PXU9PT1pP2Z1bmN0aW9uKCl7cmV0dXJuIHB9OkVuKGkpOysreTxNOylhLmNhbGwodGhpcyxoPXRbeV0seSk/KGQucHVzaChbZz0reC5jYWxsKHRoaXMsaCx5KSxwPStiLmNhbGwodGhpcyxoLHkpXSksbS5wdXNoKFsrXy5jYWxsKHRoaXMsaCx5KSwrdy5jYWxsKHRoaXMsaCx5KV0pKTpkLmxlbmd0aCYmKGwoKSxkPVtdLG09W10pO3JldHVybiBkLmxlbmd0aCYmbCgpLHYubGVuZ3RoP3Yuam9pbigiIik6bnVsbH12YXIgZT1DZSxyPUNlLHU9MCxpPXplLGE9enQsbz14aSxsPW8ua2V5LGM9byxzPSJMIixmPS43O3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9cj1uLHQpOnJ9LHQueDA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0LngxPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWk9bix0KTppfSx0LnkwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sdCk6dX0sdC55MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1uLHQpOml9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1uLHQpOmF9LHQuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bz1uOihvPXFsLmdldChuKXx8eGkpLmtleSxjPW8ucmV2ZXJzZXx8byxzPW8uY2xvc2VkPyJNIjoiTCIsdCk6bH0sdC50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPW4sdCk6Zn0sdH1mdW5jdGlvbiBJaShuKXtyZXR1cm4gbi5yYWRpdXN9ZnVuY3Rpb24gWWkobil7cmV0dXJuW24ueCxuLnldfWZ1bmN0aW9uIFppKG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLGU9dFswXSxyPXRbMV0tSGE7cmV0dXJuW2UqTWF0aC5jb3MociksZSpNYXRoLnNpbihyKV19fWZ1bmN0aW9uIFZpKCl7cmV0dXJuIDY0fWZ1bmN0aW9uIFhpKCl7cmV0dXJuImNpcmNsZSJ9ZnVuY3Rpb24gJGkobil7dmFyIHQ9TWF0aC5zcXJ0KG4vVWEpO3JldHVybiJNMCwiK3QrIkEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrLXQrIkEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrdCsiWiJ9ZnVuY3Rpb24gQmkobil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQsZSxyOyh0PXRoaXNbbl0pJiYocj10W2U9dC5hY3RpdmVdKSYmKHIudGltZXIuYz1udWxsLHIudGltZXIudD1OYU4sLS10LmNvdW50P2RlbGV0ZSB0W2VdOmRlbGV0ZSB0aGlzW25dLHQuYWN0aXZlKz0uNSxyLmV2ZW50JiZyLmV2ZW50LmludGVycnVwdC5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxyLmluZGV4KSl9fWZ1bmN0aW9uIFdpKG4sdCxlKXtyZXR1cm4gU2EobixJbCksbi5uYW1lc3BhY2U9dCxuLmlkPWUsbn1mdW5jdGlvbiBKaShuLHQsZSxyKXt2YXIgdT1uLmlkLGk9bi5uYW1lc3BhY2U7cmV0dXJuIFkobiwiZnVuY3Rpb24iPT10eXBlb2YgZT9mdW5jdGlvbihuLGEsbyl7bltpXVt1XS50d2Vlbi5zZXQodCxyKGUuY2FsbChuLG4uX19kYXRhX18sYSxvKSkpfTooZT1yKGUpLGZ1bmN0aW9uKG4pe25baV1bdV0udHdlZW4uc2V0KHQsZSl9KSl9ZnVuY3Rpb24gR2kobil7cmV0dXJuIG51bGw9PW4mJihuPSIiKSxmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9bn19ZnVuY3Rpb24gS2kobil7cmV0dXJuIG51bGw9PW4/Il9fdHJhbnNpdGlvbl9fIjoiX190cmFuc2l0aW9uXyIrbisiX18ifWZ1bmN0aW9uIFFpKG4sdCxlLHIsdSl7ZnVuY3Rpb24gaShuKXt2YXIgdD12LmRlbGF5O3JldHVybiBzLnQ9dCtsLG4+PXQ/YShuLXQpOnZvaWQocy5jPWEpfWZ1bmN0aW9uIGEoZSl7dmFyIHU9cC5hY3RpdmUsaT1wW3VdO2kmJihpLnRpbWVyLmM9bnVsbCxpLnRpbWVyLnQ9TmFOLC0tcC5jb3VudCxkZWxldGUgcFt1XSxpLmV2ZW50JiZpLmV2ZW50LmludGVycnVwdC5jYWxsKG4sbi5fX2RhdGFfXyxpLmluZGV4KSk7Zm9yKHZhciBhIGluIHApaWYocj4rYSl7dmFyIGM9cFthXTtjLnRpbWVyLmM9bnVsbCxjLnRpbWVyLnQ9TmFOLC0tcC5jb3VudCxkZWxldGUgcFthXX1zLmM9byxxbihmdW5jdGlvbigpe3JldHVybiBzLmMmJm8oZXx8MSkmJihzLmM9bnVsbCxzLnQ9TmFOKSwxfSwwLGwpLHAuYWN0aXZlPXIsdi5ldmVudCYmdi5ldmVudC5zdGFydC5jYWxsKG4sbi5fX2RhdGFfXyx0KSxnPVtdLHYudHdlZW4uZm9yRWFjaChmdW5jdGlvbihlLHIpeyhyPXIuY2FsbChuLG4uX19kYXRhX18sdCkpJiZnLnB1c2gocil9KSxoPXYuZWFzZSxmPXYuZHVyYXRpb259ZnVuY3Rpb24gbyh1KXtmb3IodmFyIGk9dS9mLGE9aChpKSxvPWcubGVuZ3RoO28+MDspZ1stLW9dLmNhbGwobixhKTtyZXR1cm4gaT49MT8odi5ldmVudCYmdi5ldmVudC5lbmQuY2FsbChuLG4uX19kYXRhX18sdCksLS1wLmNvdW50P2RlbGV0ZSBwW3JdOmRlbGV0ZSBuW2VdLDEpOnZvaWQgMH12YXIgbCxzLGYsaCxnLHA9bltlXXx8KG5bZV09e2FjdGl2ZTowLGNvdW50OjB9KSx2PXBbcl07dnx8KGw9dS50aW1lLHM9cW4oaSwwLGwpLHY9cFtyXT17dHdlZW46bmV3IGMsdGltZTpsLHRpbWVyOnMsZGVsYXk6dS5kZWxheSxkdXJhdGlvbjp1LmR1cmF0aW9uLGVhc2U6dS5lYXNlLGluZGV4OnR9LHU9bnVsbCwrK3AuY291bnQpfWZ1bmN0aW9uIG5hKG4sdCxlKXtuLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7dmFyIHI9dChuKTtyZXR1cm4idHJhbnNsYXRlKCIrKGlzRmluaXRlKHIpP3I6ZShuKSkrIiwwKSJ9KX1mdW5jdGlvbiB0YShuLHQsZSl7bi5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKG4pe3ZhciByPXQobik7cmV0dXJuInRyYW5zbGF0ZSgwLCIrKGlzRmluaXRlKHIpP3I6ZShuKSkrIikifSl9ZnVuY3Rpb24gZWEobil7cmV0dXJuIG4udG9JU09TdHJpbmcoKX1mdW5jdGlvbiByYShuLHQsZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gbih0KX1mdW5jdGlvbiB1KG4sZSl7dmFyIHI9blsxXS1uWzBdLHU9ci9lLGk9b2EuYmlzZWN0KEdsLHUpO3JldHVybiBpPT1HbC5sZW5ndGg/W3QueWVhcixLdShuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbi8zMTUzNmU2fSksZSlbMl1dOmk/dFt1L0dsW2ktMV08R2xbaV0vdT9pLTE6aV06W25jLEt1KG4sZSlbMl1dfXJldHVybiByLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdWEobi5pbnZlcnQodCkpfSxyLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obi5kb21haW4odCkscik6bi5kb21haW4oKS5tYXAodWEpfSxyLm5pY2U9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiFpc05hTihlKSYmIW4ucmFuZ2UoZSx1YSgrZSsxKSx0KS5sZW5ndGh9dmFyIGk9ci5kb21haW4oKSxhPVl1KGkpLG89bnVsbD09bj91KGEsMTApOiJudW1iZXIiPT10eXBlb2YgbiYmdShhLG4pO3JldHVybiBvJiYobj1vWzBdLHQ9b1sxXSksci5kb21haW4oWHUoaSx0PjE/e2Zsb29yOmZ1bmN0aW9uKHQpe2Zvcig7ZSh0PW4uZmxvb3IodCkpOyl0PXVhKHQtMSk7cmV0dXJuIHR9LGNlaWw6ZnVuY3Rpb24odCl7Zm9yKDtlKHQ9bi5jZWlsKHQpKTspdD11YSgrdCsxKTtyZXR1cm4gdH19Om4pKX0sci50aWNrcz1mdW5jdGlvbihuLHQpe3ZhciBlPVl1KHIuZG9tYWluKCkpLGk9bnVsbD09bj91KGUsMTApOiJudW1iZXIiPT10eXBlb2Ygbj91KGUsbik6IW4ucmFuZ2UmJlt7cmFuZ2U6bn0sdF07cmV0dXJuIGkmJihuPWlbMF0sdD1pWzFdKSxuLnJhbmdlKGVbMF0sdWEoK2VbMV0rMSksMT50PzE6dCl9LHIudGlja0Zvcm1hdD1mdW5jdGlvbigpe3JldHVybiBlfSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gcmEobi5jb3B5KCksdCxlKX0sSnUocixuKX1mdW5jdGlvbiB1YShuKXtyZXR1cm4gbmV3IERhdGUobil9ZnVuY3Rpb24gaWEobil7cmV0dXJuIEpTT04ucGFyc2Uobi5yZXNwb25zZVRleHQpfWZ1bmN0aW9uIGFhKG4pe3ZhciB0PXNhLmNyZWF0ZVJhbmdlKCk7cmV0dXJuIHQuc2VsZWN0Tm9kZShzYS5ib2R5KSx0LmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChuLnJlc3BvbnNlVGV4dCl9dmFyIG9hPXt2ZXJzaW9uOiIzLjUuMTQifSxsYT1bXS5zbGljZSxjYT1mdW5jdGlvbihuKXtyZXR1cm4gbGEuY2FsbChuKX0sc2E9dGhpcy5kb2N1bWVudDtpZihzYSl0cnl7Y2Eoc2EuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlfWNhdGNoKGZhKXtjYT1mdW5jdGlvbihuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1uZXcgQXJyYXkodCk7dC0tOyllW3RdPW5bdF07cmV0dXJuIGV9fWlmKERhdGUubm93fHwoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KSxzYSl0cnl7c2EuY3JlYXRlRWxlbWVudCgiRElWIikuc3R5bGUuc2V0UHJvcGVydHkoIm9wYWNpdHkiLDAsIiIpfWNhdGNoKGhhKXt2YXIgZ2E9dGhpcy5FbGVtZW50LnByb3RvdHlwZSxwYT1nYS5zZXRBdHRyaWJ1dGUsdmE9Z2Euc2V0QXR0cmlidXRlTlMsZGE9dGhpcy5DU1NTdHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZSxtYT1kYS5zZXRQcm9wZXJ0eTtnYS5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24obix0KXtwYS5jYWxsKHRoaXMsbix0KyIiKX0sZ2Euc2V0QXR0cmlidXRlTlM9ZnVuY3Rpb24obix0LGUpe3ZhLmNhbGwodGhpcyxuLHQsZSsiIil9LGRhLnNldFByb3BlcnR5PWZ1bmN0aW9uKG4sdCxlKXttYS5jYWxsKHRoaXMsbix0KyIiLGUpfX1vYS5hc2NlbmRpbmc9ZSxvYS5kZXNjZW5kaW5nPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4+dD8tMTp0Pm4/MTp0Pj1uPzA6TmFOfSxvYS5taW49ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9blt1XSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj1uW3VdKSYmZT5yJiYoZT1yKX1lbHNle2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJmU+ciYmKGU9cil9cmV0dXJuIGV9LG9hLm1heD1mdW5jdGlvbihuLHQpe3ZhciBlLHIsdT0tMSxpPW4ubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IoOysrdTxpOylpZihudWxsIT0ocj1uW3VdKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7Kyt1PGk7KW51bGwhPShyPW5bdV0pJiZyPmUmJihlPXIpfWVsc2V7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmcj5lJiYoZT1yKX1yZXR1cm4gZX0sb2EuZXh0ZW50PWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1LGk9LTEsYT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK2k8YTspaWYobnVsbCE9KHI9bltpXSkmJnI+PXIpe2U9dT1yO2JyZWFrfWZvcig7KytpPGE7KW51bGwhPShyPW5baV0pJiYoZT5yJiYoZT1yKSxyPnUmJih1PXIpKX1lbHNle2Zvcig7KytpPGE7KWlmKG51bGwhPShyPXQuY2FsbChuLG5baV0saSkpJiZyPj1yKXtlPXU9cjticmVha31mb3IoOysraTxhOyludWxsIT0ocj10LmNhbGwobixuW2ldLGkpKSYmKGU+ciYmKGU9cikscj51JiYodT1yKSl9cmV0dXJuW2UsdV19LG9hLnN1bT1mdW5jdGlvbihuLHQpe3ZhciBlLHI9MCxpPW4ubGVuZ3RoLGE9LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2E8aTspdShlPStuW2FdKSYmKHIrPWUpO2Vsc2UgZm9yKDsrK2E8aTspdShlPSt0LmNhbGwobixuW2FdLGEpKSYmKHIrPWUpO3JldHVybiByfSxvYS5tZWFuPWZ1bmN0aW9uKG4sdCl7dmFyIGUsaT0wLGE9bi5sZW5ndGgsbz0tMSxsPWE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK288YTspdShlPXIobltvXSkpP2krPWU6LS1sO2Vsc2UgZm9yKDsrK288YTspdShlPXIodC5jYWxsKG4sbltvXSxvKSkpP2krPWU6LS1sO3JldHVybiBsP2kvbDp2b2lkIDB9LG9hLnF1YW50aWxlPWZ1bmN0aW9uKG4sdCl7dmFyIGU9KG4ubGVuZ3RoLTEpKnQrMSxyPU1hdGguZmxvb3IoZSksdT0rbltyLTFdLGk9ZS1yO3JldHVybiBpP3UraSoobltyXS11KTp1fSxvYS5tZWRpYW49ZnVuY3Rpb24obix0KXt2YXIgaSxhPVtdLG89bi5sZW5ndGgsbD0tMTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrbDxvOyl1KGk9cihuW2xdKSkmJmEucHVzaChpKTtlbHNlIGZvcig7KytsPG87KXUoaT1yKHQuY2FsbChuLG5bbF0sbCkpKSYmYS5wdXNoKGkpO3JldHVybiBhLmxlbmd0aD9vYS5xdWFudGlsZShhLnNvcnQoZSksLjUpOnZvaWQgMH0sb2EudmFyaWFuY2U9ZnVuY3Rpb24obix0KXt2YXIgZSxpLGE9bi5sZW5ndGgsbz0wLGw9MCxjPS0xLHM9MDtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrYzxhOyl1KGU9cihuW2NdKSkmJihpPWUtbyxvKz1pLysrcyxsKz1pKihlLW8pKTtlbHNlIGZvcig7KytjPGE7KXUoZT1yKHQuY2FsbChuLG5bY10sYykpKSYmKGk9ZS1vLG8rPWkvKytzLGwrPWkqKGUtbykpO3JldHVybiBzPjE/bC8ocy0xKTp2b2lkIDB9LG9hLmRldmlhdGlvbj1mdW5jdGlvbigpe3ZhciBuPW9hLnZhcmlhbmNlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbj9NYXRoLnNxcnQobik6bn07dmFyIHlhPWkoZSk7b2EuYmlzZWN0TGVmdD15YS5sZWZ0LG9hLmJpc2VjdD1vYS5iaXNlY3RSaWdodD15YS5yaWdodCxvYS5iaXNlY3Rvcj1mdW5jdGlvbihuKXtyZXR1cm4gaSgxPT09bi5sZW5ndGg/ZnVuY3Rpb24odCxyKXtyZXR1cm4gZShuKHQpLHIpfTpuKX0sb2Euc2h1ZmZsZT1mdW5jdGlvbihuLHQsZSl7KGk9YXJndW1lbnRzLmxlbmd0aCk8MyYmKGU9bi5sZW5ndGgsMj5pJiYodD0wKSk7Zm9yKHZhciByLHUsaT1lLXQ7aTspdT1NYXRoLnJhbmRvbSgpKmktLXwwLHI9bltpK3RdLG5baSt0XT1uW3UrdF0sblt1K3RdPXI7cmV0dXJuIG59LG9hLnBlcm11dGU9ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9dC5sZW5ndGgscj1uZXcgQXJyYXkoZSk7ZS0tOylyW2VdPW5bdFtlXV07cmV0dXJuIHJ9LG9hLnBhaXJzPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlPTAscj1uLmxlbmd0aC0xLHU9blswXSxpPW5ldyBBcnJheSgwPnI/MDpyKTtyPmU7KWlbZV09W3Q9dSx1PW5bKytlXV07cmV0dXJuIGl9LG9hLnppcD1mdW5jdGlvbigpe2lmKCEocj1hcmd1bWVudHMubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIG49LTEsdD1vYS5taW4oYXJndW1lbnRzLGEpLGU9bmV3IEFycmF5KHQpOysrbjx0Oylmb3IodmFyIHIsdT0tMSxpPWVbbl09bmV3IEFycmF5KHIpOysrdTxyOylpW3VdPWFyZ3VtZW50c1t1XVtuXTtyZXR1cm4gZX0sb2EudHJhbnNwb3NlPWZ1bmN0aW9uKG4pe3JldHVybiBvYS56aXAuYXBwbHkob2Esbil9LG9hLmtleXM9ZnVuY3Rpb24obil7dmFyIHQ9W107Zm9yKHZhciBlIGluIG4pdC5wdXNoKGUpO3JldHVybiB0fSxvYS52YWx1ZXM9ZnVuY3Rpb24obil7dmFyIHQ9W107Zm9yKHZhciBlIGluIG4pdC5wdXNoKG5bZV0pO3JldHVybiB0fSxvYS5lbnRyaWVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaCh7a2V5OmUsdmFsdWU6bltlXX0pO3JldHVybiB0fSxvYS5tZXJnZT1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLHU9bi5sZW5ndGgsaT0tMSxhPTA7KytpPHU7KWErPW5baV0ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKTstLXU+PTA7KWZvcihyPW5bdV0sdD1yLmxlbmd0aDstLXQ+PTA7KWVbLS1hXT1yW3RdO3JldHVybiBlfTt2YXIgTWE9TWF0aC5hYnM7b2EucmFuZ2U9ZnVuY3Rpb24obix0LGUpe2lmKGFyZ3VtZW50cy5sZW5ndGg8MyYmKGU9MSxhcmd1bWVudHMubGVuZ3RoPDImJih0PW4sbj0wKSksKHQtbikvZT09PTEvMCl0aHJvdyBuZXcgRXJyb3IoImluZmluaXRlIHJhbmdlIik7dmFyIHIsdT1bXSxpPW8oTWEoZSkpLGE9LTE7aWYobio9aSx0Kj1pLGUqPWksMD5lKWZvcig7KHI9bitlKisrYSk+dDspdS5wdXNoKHIvaSk7ZWxzZSBmb3IoOyhyPW4rZSorK2EpPHQ7KXUucHVzaChyL2kpO3JldHVybiB1fSxvYS5tYXA9ZnVuY3Rpb24obix0KXt2YXIgZT1uZXcgYztpZihuIGluc3RhbmNlb2YgYyluLmZvckVhY2goZnVuY3Rpb24obix0KXtlLnNldChuLHQpfSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KG4pKXt2YXIgcix1PS0xLGk9bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK3U8aTspZS5zZXQodSxuW3VdKTtlbHNlIGZvcig7Kyt1PGk7KWUuc2V0KHQuY2FsbChuLHI9blt1XSx1KSxyKX1lbHNlIGZvcih2YXIgYSBpbiBuKWUuc2V0KGEsblthXSk7cmV0dXJuIGV9O3ZhciB4YT0iX19wcm90b19fIixiYT0iXHgwMCI7bChjLHtoYXM6aCxnZXQ6ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX1tzKG4pXX0sc2V0OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIHRoaXMuX1tzKG4pXT10fSxyZW1vdmU6ZyxrZXlzOnAsdmFsdWVzOmZ1bmN0aW9uKCl7dmFyIG49W107Zm9yKHZhciB0IGluIHRoaXMuXyluLnB1c2godGhpcy5fW3RdKTtyZXR1cm4gbn0sZW50cmllczpmdW5jdGlvbigpe3ZhciBuPVtdO2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5wdXNoKHtrZXk6Zih0KSx2YWx1ZTp0aGlzLl9bdF19KTtyZXR1cm4gbn0sc2l6ZTp2LGVtcHR5OmQsZm9yRWFjaDpmdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gdGhpcy5fKW4uY2FsbCh0aGlzLGYodCksdGhpcy5fW3RdKX19KSxvYS5uZXN0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0LGEsbyl7aWYobz49aS5sZW5ndGgpcmV0dXJuIHI/ci5jYWxsKHUsYSk6ZT9hLnNvcnQoZSk6YTtmb3IodmFyIGwscyxmLGgsZz0tMSxwPWEubGVuZ3RoLHY9aVtvKytdLGQ9bmV3IGM7KytnPHA7KShoPWQuZ2V0KGw9dihzPWFbZ10pKSk/aC5wdXNoKHMpOmQuc2V0KGwsW3NdKTtyZXR1cm4gdD8ocz10KCksZj1mdW5jdGlvbihlLHIpe3Muc2V0KGUsbih0LHIsbykpfSk6KHM9e30sZj1mdW5jdGlvbihlLHIpe3NbZV09bih0LHIsbyl9KSxkLmZvckVhY2goZiksc31mdW5jdGlvbiB0KG4sZSl7aWYoZT49aS5sZW5ndGgpcmV0dXJuIG47dmFyIHI9W10sdT1hW2UrK107cmV0dXJuIG4uZm9yRWFjaChmdW5jdGlvbihuLHUpe3IucHVzaCh7a2V5Om4sdmFsdWVzOnQodSxlKX0pfSksdT9yLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gdShuLmtleSx0LmtleSl9KTpyfXZhciBlLHIsdT17fSxpPVtdLGE9W107cmV0dXJuIHUubWFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oZSx0LDApfSx1LmVudHJpZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobihvYS5tYXAsZSwwKSwwKX0sdS5rZXk9ZnVuY3Rpb24obil7cmV0dXJuIGkucHVzaChuKSx1fSx1LnNvcnRLZXlzPWZ1bmN0aW9uKG4pe3JldHVybiBhW2kubGVuZ3RoLTFdPW4sdX0sdS5zb3J0VmFsdWVzPWZ1bmN0aW9uKG4pe3JldHVybiBlPW4sdX0sdS5yb2xsdXA9ZnVuY3Rpb24obil7cmV0dXJuIHI9bix1fSx1fSxvYS5zZXQ9ZnVuY3Rpb24obil7dmFyIHQ9bmV3IG07aWYobilmb3IodmFyIGU9MCxyPW4ubGVuZ3RoO3I+ZTsrK2UpdC5hZGQobltlXSk7cmV0dXJuIHR9LGwobSx7aGFzOmgsYWRkOmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9bcyhuKz0iIildPSEwLG59LHJlbW92ZTpnLHZhbHVlczpwLHNpemU6dixlbXB0eTpkLGZvckVhY2g6ZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIHRoaXMuXyluLmNhbGwodGhpcyxmKHQpKX19KSxvYS5iZWhhdmlvcj17fSxvYS5yZWJpbmQ9ZnVuY3Rpb24obix0KXtmb3IodmFyIGUscj0xLHU9YXJndW1lbnRzLmxlbmd0aDsrK3I8dTspbltlPWFyZ3VtZW50c1tyXV09TShuLHQsdFtlXSk7cmV0dXJuIG59O3ZhciBfYT1bIndlYmtpdCIsIm1zIiwibW96IiwiTW96IiwibyIsIk8iXTtvYS5kaXNwYXRjaD1mdW5jdGlvbigpe2Zvcih2YXIgbj1uZXcgXyx0PS0xLGU9YXJndW1lbnRzLmxlbmd0aDsrK3Q8ZTspblthcmd1bWVudHNbdF1dPXcobik7cmV0dXJuIG59LF8ucHJvdG90eXBlLm9uPWZ1bmN0aW9uKG4sdCl7dmFyIGU9bi5pbmRleE9mKCIuIikscj0iIjtpZihlPj0wJiYocj1uLnNsaWNlKGUrMSksbj1uLnNsaWNlKDAsZSkpLG4pcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj90aGlzW25dLm9uKHIpOnRoaXNbbl0ub24ocix0KTtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7aWYobnVsbD09dClmb3IobiBpbiB0aGlzKXRoaXMuaGFzT3duUHJvcGVydHkobikmJnRoaXNbbl0ub24ocixudWxsKTtyZXR1cm4gdGhpc319LG9hLmV2ZW50PW51bGwsb2EucmVxdW90ZT1mdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKHdhLCJcXCQmIil9O3ZhciB3YT0vW1xcXF5cJFwqXCtcP1x8XFtcXVwoXClcLlx7XH1dL2csU2E9e30uX19wcm90b19fP2Z1bmN0aW9uKG4sdCl7bi5fX3Byb3RvX189dH06ZnVuY3Rpb24obix0KXtmb3IodmFyIGUgaW4gdCluW2VdPXRbZV19LGthPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvcihuKX0sTmE9ZnVuY3Rpb24obix0KXtyZXR1cm4gdC5xdWVyeVNlbGVjdG9yQWxsKG4pfSxFYT1mdW5jdGlvbihuLHQpe3ZhciBlPW4ubWF0Y2hlc3x8blt4KG4sIm1hdGNoZXNTZWxlY3RvciIpXTtyZXR1cm4oRWE9ZnVuY3Rpb24obix0KXtyZXR1cm4gZS5jYWxsKG4sdCl9KShuLHQpfTsiZnVuY3Rpb24iPT10eXBlb2YgU2l6emxlJiYoa2E9ZnVuY3Rpb24obix0KXtyZXR1cm4gU2l6emxlKG4sdClbMF18fG51bGx9LE5hPVNpenpsZSxFYT1TaXp6bGUubWF0Y2hlc1NlbGVjdG9yKSxvYS5zZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gb2Euc2VsZWN0KHNhLmRvY3VtZW50RWxlbWVudCl9O3ZhciBBYT1vYS5zZWxlY3Rpb24ucHJvdG90eXBlPVtdO0FhLnNlbGVjdD1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdSxpPVtdO249QShuKTtmb3IodmFyIGE9LTEsbz10aGlzLmxlbmd0aDsrK2E8bzspe2kucHVzaCh0PVtdKSx0LnBhcmVudE5vZGU9KHI9dGhpc1thXSkucGFyZW50Tm9kZTtmb3IodmFyIGw9LTEsYz1yLmxlbmd0aDsrK2w8YzspKHU9cltsXSk/KHQucHVzaChlPW4uY2FsbCh1LHUuX19kYXRhX18sbCxhKSksZSYmIl9fZGF0YV9fImluIHUmJihlLl9fZGF0YV9fPXUuX19kYXRhX18pKTp0LnB1c2gobnVsbCl9cmV0dXJuIEUoaSl9LEFhLnNlbGVjdEFsbD1mdW5jdGlvbihuKXt2YXIgdCxlLHI9W107bj1DKG4pO2Zvcih2YXIgdT0tMSxpPXRoaXMubGVuZ3RoOysrdTxpOylmb3IodmFyIGE9dGhpc1t1XSxvPS0xLGw9YS5sZW5ndGg7KytvPGw7KShlPWFbb10pJiYoci5wdXNoKHQ9Y2Eobi5jYWxsKGUsZS5fX2RhdGFfXyxvLHUpKSksdC5wYXJlbnROb2RlPWUpO3JldHVybiBFKHIpfTt2YXIgQ2E9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIix4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9O29hLm5zPXtwcmVmaXg6Q2EscXVhbGlmeTpmdW5jdGlvbihuKXt2YXIgdD1uLmluZGV4T2YoIjoiKSxlPW47cmV0dXJuIHQ+PTAmJiJ4bWxucyIhPT0oZT1uLnNsaWNlKDAsdCkpJiYobj1uLnNsaWNlKHQrMSkpLENhLmhhc093blByb3BlcnR5KGUpP3tzcGFjZTpDYVtlXSxsb2NhbDpufTpufX0sQWEuYXR0cj1mdW5jdGlvbihuLHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXt2YXIgZT10aGlzLm5vZGUoKTtyZXR1cm4gbj1vYS5ucy5xdWFsaWZ5KG4pLG4ubG9jYWw/ZS5nZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOmUuZ2V0QXR0cmlidXRlKG4pfWZvcih0IGluIG4pdGhpcy5lYWNoKHoodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaCh6KG4sdCkpfSxBYS5jbGFzc2VkPWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBlPXRoaXMubm9kZSgpLHI9KG49VChuKSkubGVuZ3RoLHU9LTE7aWYodD1lLmNsYXNzTGlzdCl7Zm9yKDsrK3U8cjspaWYoIXQuY29udGFpbnMoblt1XSkpcmV0dXJuITF9ZWxzZSBmb3IodD1lLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsrK3U8cjspaWYoIXEoblt1XSkudGVzdCh0KSlyZXR1cm4hMTtyZXR1cm4hMH1mb3IodCBpbiBuKXRoaXMuZWFjaChSKHQsblt0XSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goUihuLHQpKX0sQWEuc3R5bGU9ZnVuY3Rpb24obixlLHIpe3ZhciB1PWFyZ3VtZW50cy5sZW5ndGg7aWYoMz51KXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+dSYmKGU9IiIpO2ZvcihyIGluIG4pdGhpcy5lYWNoKFAocixuW3JdLGUpKTtyZXR1cm4gdGhpc31pZigyPnUpe3ZhciBpPXRoaXMubm9kZSgpO3JldHVybiB0KGkpLmdldENvbXB1dGVkU3R5bGUoaSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pfXI9IiJ9cmV0dXJuIHRoaXMuZWFjaChQKG4sZSxyKSl9LEFhLnByb3BlcnR5PWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pcmV0dXJuIHRoaXMubm9kZSgpW25dO2Zvcih0IGluIG4pdGhpcy5lYWNoKFUodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaChVKG4sdCkpfSxBYS50ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09dD8iIjp0fTpudWxsPT1uP2Z1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD0iIn06ZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PW59KTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0sQWEuaHRtbD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24oKXt2YXIgdD1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT10PyIiOnR9Om51bGw9PW4/ZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD0iIn06ZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD1ufSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSxBYS5hcHBlbmQ9ZnVuY3Rpb24obil7cmV0dXJuIG49aihuKSx0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwcGVuZENoaWxkKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pfSxBYS5pbnNlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gbj1qKG4pLHQ9QSh0KSx0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KX0sQWEucmVtb3ZlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChGKX0sQWEuZGF0YT1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlKXt2YXIgcix1LGksYT1uLmxlbmd0aCxmPWUubGVuZ3RoLGg9TWF0aC5taW4oYSxmKSxnPW5ldyBBcnJheShmKSxwPW5ldyBBcnJheShmKSx2PW5ldyBBcnJheShhKTtpZih0KXt2YXIgZCxtPW5ldyBjLHk9bmV3IEFycmF5KGEpO2ZvcihyPS0xOysrcjxhOykodT1uW3JdKSYmKG0uaGFzKGQ9dC5jYWxsKHUsdS5fX2RhdGFfXyxyKSk/dltyXT11Om0uc2V0KGQsdSkseVtyXT1kKTtmb3Iocj0tMTsrK3I8ZjspKHU9bS5nZXQoZD10LmNhbGwoZSxpPWVbcl0scikpKT91IT09ITAmJihnW3JdPXUsdS5fX2RhdGFfXz1pKTpwW3JdPUgoaSksbS5zZXQoZCwhMCk7Zm9yKHI9LTE7KytyPGE7KXIgaW4geSYmbS5nZXQoeVtyXSkhPT0hMCYmKHZbcl09bltyXSl9ZWxzZXtmb3Iocj0tMTsrK3I8aDspdT1uW3JdLGk9ZVtyXSx1Pyh1Ll9fZGF0YV9fPWksZ1tyXT11KTpwW3JdPUgoaSk7Zm9yKDtmPnI7KytyKXBbcl09SChlW3JdKTtmb3IoO2E+cjsrK3IpdltyXT1uW3JdfXAudXBkYXRlPWcscC5wYXJlbnROb2RlPWcucGFyZW50Tm9kZT12LnBhcmVudE5vZGU9bi5wYXJlbnROb2RlLG8ucHVzaChwKSxsLnB1c2goZykscy5wdXNoKHYpfXZhciByLHUsaT0tMSxhPXRoaXMubGVuZ3RoO2lmKCFhcmd1bWVudHMubGVuZ3RoKXtmb3Iobj1uZXcgQXJyYXkoYT0ocj10aGlzWzBdKS5sZW5ndGgpOysraTxhOykodT1yW2ldKSYmKG5baV09dS5fX2RhdGFfXyk7cmV0dXJuIG59dmFyIG89WihbXSksbD1FKFtdKSxzPUUoW10pO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKWZvcig7KytpPGE7KWUocj10aGlzW2ldLG4uY2FsbChyLHIucGFyZW50Tm9kZS5fX2RhdGFfXyxpKSk7ZWxzZSBmb3IoOysraTxhOyllKHI9dGhpc1tpXSxuKTtyZXR1cm4gbC5lbnRlcj1mdW5jdGlvbigpe3JldHVybiBvfSxsLmV4aXQ9ZnVuY3Rpb24oKXtyZXR1cm4gc30sbH0sQWEuZGF0dW09ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLG4pOnRoaXMucHJvcGVydHkoIl9fZGF0YV9fIil9LEFhLmZpbHRlcj1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdT1bXTsiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49TyhuKSk7Zm9yKHZhciBpPTAsYT10aGlzLmxlbmd0aDthPmk7aSsrKXt1LnB1c2godD1bXSksdC5wYXJlbnROb2RlPShlPXRoaXNbaV0pLnBhcmVudE5vZGU7Zm9yKHZhciBvPTAsbD1lLmxlbmd0aDtsPm87bysrKShyPWVbb10pJiZuLmNhbGwocixyLl9fZGF0YV9fLG8saSkmJnQucHVzaChyKX1yZXR1cm4gRSh1KX0sQWEub3JkZXI9ZnVuY3Rpb24oKXtmb3IodmFyIG49LTEsdD10aGlzLmxlbmd0aDsrK248dDspZm9yKHZhciBlLHI9dGhpc1tuXSx1PXIubGVuZ3RoLTEsaT1yW3VdOy0tdT49MDspKGU9clt1XSkmJihpJiZpIT09ZS5uZXh0U2libGluZyYmaS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGkpLGk9ZSk7cmV0dXJuIHRoaXN9LEFhLnNvcnQ9ZnVuY3Rpb24obil7bj1JLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtmb3IodmFyIHQ9LTEsZT10aGlzLmxlbmd0aDsrK3Q8ZTspdGhpc1t0XS5zb3J0KG4pO3JldHVybiB0aGlzLm9yZGVyKCl9LEFhLmVhY2g9ZnVuY3Rpb24obil7cmV0dXJuIFkodGhpcyxmdW5jdGlvbih0LGUscil7bi5jYWxsKHQsdC5fX2RhdGFfXyxlLHIpfSl9LEFhLmNhbGw9ZnVuY3Rpb24obil7dmFyIHQ9Y2EoYXJndW1lbnRzKTtyZXR1cm4gbi5hcHBseSh0WzBdPXRoaXMsdCksdGhpc30sQWEuZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LEFhLm5vZGU9ZnVuY3Rpb24oKXtmb3IodmFyIG49MCx0PXRoaXMubGVuZ3RoO3Q+bjtuKyspZm9yKHZhciBlPXRoaXNbbl0scj0wLHU9ZS5sZW5ndGg7dT5yO3IrKyl7dmFyIGk9ZVtyXTtpZihpKXJldHVybiBpfXJldHVybiBudWxsfSxBYS5zaXplPWZ1bmN0aW9uKCl7dmFyIG49MDtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKCl7KytufSksbn07dmFyIHphPVtdO29hLnNlbGVjdGlvbi5lbnRlcj1aLG9hLnNlbGVjdGlvbi5lbnRlci5wcm90b3R5cGU9emEsemEuYXBwZW5kPUFhLmFwcGVuZCx6YS5lbXB0eT1BYS5lbXB0eSx6YS5ub2RlPUFhLm5vZGUsemEuY2FsbD1BYS5jYWxsLHphLnNpemU9QWEuc2l6ZSx6YS5zZWxlY3Q9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1LGksYT1bXSxvPS0xLGw9dGhpcy5sZW5ndGg7KytvPGw7KXtyPSh1PXRoaXNbb10pLnVwZGF0ZSxhLnB1c2godD1bXSksdC5wYXJlbnROb2RlPXUucGFyZW50Tm9kZTtmb3IodmFyIGM9LTEscz11Lmxlbmd0aDsrK2M8czspKGk9dVtjXSk/KHQucHVzaChyW2NdPWU9bi5jYWxsKHUucGFyZW50Tm9kZSxpLl9fZGF0YV9fLGMsbykpLGUuX19kYXRhX189aS5fX2RhdGFfXyk6dC5wdXNoKG51bGwpfXJldHVybiBFKGEpfSx6YS5pbnNlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYodD1WKHRoaXMpKSxBYS5pbnNlcnQuY2FsbCh0aGlzLG4sdCl9LG9hLnNlbGVjdD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/KGU9W2thKHQsc2EpXSxlLnBhcmVudE5vZGU9c2EuZG9jdW1lbnRFbGVtZW50KTooZT1bdF0sZS5wYXJlbnROb2RlPW4odCkpLEUoW2VdKX0sb2Euc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0O3JldHVybiJzdHJpbmciPT10eXBlb2Ygbj8odD1jYShOYShuLHNhKSksdC5wYXJlbnROb2RlPXNhLmRvY3VtZW50RWxlbWVudCk6KHQ9Y2EobiksdC5wYXJlbnROb2RlPW51bGwpLEUoW3RdKX0sQWEub249ZnVuY3Rpb24obix0LGUpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5yKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+ciYmKHQ9ITEpO2ZvcihlIGluIG4pdGhpcy5lYWNoKFgoZSxuW2VdLHQpKTtyZXR1cm4gdGhpc31pZigyPnIpcmV0dXJuKHI9dGhpcy5ub2RlKClbIl9fb24iK25dKSYmci5fO2U9ITF9cmV0dXJuIHRoaXMuZWFjaChYKG4sdCxlKSl9O3ZhciBMYT1vYS5tYXAoe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSk7c2EmJkxhLmZvckVhY2goZnVuY3Rpb24obil7Im9uIituIGluIHNhJiZMYS5yZW1vdmUobil9KTt2YXIgcWEsVGE9MDtvYS5tb3VzZT1mdW5jdGlvbihuKXtyZXR1cm4gSihuLGsoKSl9O3ZhciBSYT10aGlzLm5hdmlnYXRvciYmL1dlYktpdC8udGVzdCh0aGlzLm5hdmlnYXRvci51c2VyQWdlbnQpPy0xOjA7b2EudG91Y2g9ZnVuY3Rpb24obix0LGUpe2lmKGFyZ3VtZW50cy5sZW5ndGg8MyYmKGU9dCx0PWsoKS5jaGFuZ2VkVG91Y2hlcyksdClmb3IodmFyIHIsdT0wLGk9dC5sZW5ndGg7aT51OysrdSlpZigocj10W3VdKS5pZGVudGlmaWVyPT09ZSlyZXR1cm4gSihuLHIpfSxvYS5iZWhhdmlvci5kcmFnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3RoaXMub24oIm1vdXNlZG93bi5kcmFnIixpKS5vbigidG91Y2hzdGFydC5kcmFnIixhKX1mdW5jdGlvbiBlKG4sdCxlLGksYSl7cmV0dXJuIGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbygpe3ZhciBuLGUscj10KGgsdik7ciYmKG49clswXS1NWzBdLGU9clsxXS1NWzFdLHB8PW58ZSxNPXIsZyh7dHlwZToiZHJhZyIseDpyWzBdK2NbMF0seTpyWzFdK2NbMV0sZHg6bixkeTplfSkpfWZ1bmN0aW9uIGwoKXt0KGgsdikmJihtLm9uKGkrZCxudWxsKS5vbihhK2QsbnVsbCkseShwKSxnKHt0eXBlOiJkcmFnZW5kIn0pKX12YXIgYyxzPXRoaXMsZj1vYS5ldmVudC50YXJnZXQsaD1zLnBhcmVudE5vZGUsZz1yLm9mKHMsYXJndW1lbnRzKSxwPTAsdj1uKCksZD0iLmRyYWciKyhudWxsPT12PyIiOiItIit2KSxtPW9hLnNlbGVjdChlKGYpKS5vbihpK2Qsbykub24oYStkLGwpLHk9VyhmKSxNPXQoaCx2KTt1PyhjPXUuYXBwbHkocyxhcmd1bWVudHMpLGM9W2MueC1NWzBdLGMueS1NWzFdXSk6Yz1bMCwwXSxnKHt0eXBlOiJkcmFnc3RhcnQifSl9fXZhciByPU4obiwiZHJhZyIsImRyYWdzdGFydCIsImRyYWdlbmQiKSx1PW51bGwsaT1lKGIsb2EubW91c2UsdCwibW91c2Vtb3ZlIiwibW91c2V1cCIpLGE9ZShHLG9hLnRvdWNoLHksInRvdWNobW92ZSIsInRvdWNoZW5kIik7cmV0dXJuIG4ub3JpZ2luPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsbik6dX0sb2EucmViaW5kKG4sciwib24iKX0sb2EudG91Y2hlcz1mdW5jdGlvbihuLHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PWsoKS50b3VjaGVzKSx0P2NhKHQpLm1hcChmdW5jdGlvbih0KXt2YXIgZT1KKG4sdCk7cmV0dXJuIGUuaWRlbnRpZmllcj10LmlkZW50aWZpZXIsZX0pOltdfTt2YXIgRGE9MWUtNixQYT1EYSpEYSxVYT1NYXRoLlBJLGphPTIqVWEsRmE9amEtRGEsSGE9VWEvMixPYT1VYS8xODAsSWE9MTgwL1VhLFlhPU1hdGguU1FSVDIsWmE9MixWYT00O29hLmludGVycG9sYXRlWm9vbT1mdW5jdGlvbihuLHQpe3ZhciBlLHIsdT1uWzBdLGk9blsxXSxhPW5bMl0sbz10WzBdLGw9dFsxXSxjPXRbMl0scz1vLXUsZj1sLWksaD1zKnMrZipmO2lmKFBhPmgpcj1NYXRoLmxvZyhjL2EpL1lhLGU9ZnVuY3Rpb24obil7cmV0dXJuW3UrbipzLGkrbipmLGEqTWF0aC5leHAoWWEqbipyKV19O2Vsc2V7dmFyIGc9TWF0aC5zcXJ0KGgpLHA9KGMqYy1hKmErVmEqaCkvKDIqYSpaYSpnKSx2PShjKmMtYSphLVZhKmgpLygyKmMqWmEqZyksZD1NYXRoLmxvZyhNYXRoLnNxcnQocCpwKzEpLXApLG09TWF0aC5sb2coTWF0aC5zcXJ0KHYqdisxKS12KTtyPShtLWQpL1lhLGU9ZnVuY3Rpb24obil7dmFyIHQ9bipyLGU9cm4oZCksbz1hLyhaYSpnKSooZSp1bihZYSp0K2QpLWVuKGQpKTtyZXR1cm5bdStvKnMsaStvKmYsYSplL3JuKFlhKnQrZCldfX1yZXR1cm4gZS5kdXJhdGlvbj0xZTMqcixlfSxvYS5iZWhhdmlvci56b29tPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtuLm9uKEwsZikub24oJGErIi56b29tIixnKS5vbigiZGJsY2xpY2suem9vbSIscCkub24oUixoKX1mdW5jdGlvbiBlKG4pe3JldHVyblsoblswXS1rLngpL2suaywoblsxXS1rLnkpL2sua119ZnVuY3Rpb24gcihuKXtyZXR1cm5bblswXSprLmsray54LG5bMV0qay5rK2sueV19ZnVuY3Rpb24gdShuKXtrLms9TWF0aC5tYXgoQVswXSxNYXRoLm1pbihBWzFdLG4pKX1mdW5jdGlvbiBpKG4sdCl7dD1yKHQpLGsueCs9blswXS10WzBdLGsueSs9blsxXS10WzFdfWZ1bmN0aW9uIGEodCxlLHIsYSl7dC5fX2NoYXJ0X189e3g6ay54LHk6ay55LGs6ay5rfSx1KE1hdGgucG93KDIsYSkpLGkoZD1lLHIpLHQ9b2Euc2VsZWN0KHQpLEM+MCYmKHQ9dC50cmFuc2l0aW9uKCkuZHVyYXRpb24oQykpLHQuY2FsbChuLmV2ZW50KX1mdW5jdGlvbiBvKCl7YiYmYi5kb21haW4oeC5yYW5nZSgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4obi1rLngpL2sua30pLm1hcCh4LmludmVydCkpLHcmJncuZG9tYWluKF8ucmFuZ2UoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4tay55KS9rLmt9KS5tYXAoXy5pbnZlcnQpKX1mdW5jdGlvbiBsKG4pe3orK3x8bih7dHlwZToiem9vbXN0YXJ0In0pfWZ1bmN0aW9uIGMobil7bygpLG4oe3R5cGU6Inpvb20iLHNjYWxlOmsuayx0cmFuc2xhdGU6W2sueCxrLnldfSl9ZnVuY3Rpb24gcyhuKXstLXp8fChuKHt0eXBlOiJ6b29tZW5kIn0pLGQ9bnVsbCl9ZnVuY3Rpb24gZigpe2Z1bmN0aW9uIG4oKXtvPTEsaShvYS5tb3VzZSh1KSxoKSxjKGEpfWZ1bmN0aW9uIHIoKXtmLm9uKHEsbnVsbCkub24oVCxudWxsKSxnKG8pLHMoYSl9dmFyIHU9dGhpcyxhPUQub2YodSxhcmd1bWVudHMpLG89MCxmPW9hLnNlbGVjdCh0KHUpKS5vbihxLG4pLm9uKFQsciksaD1lKG9hLm1vdXNlKHUpKSxnPVcodSk7T2wuY2FsbCh1KSxsKGEpfWZ1bmN0aW9uIGgoKXtmdW5jdGlvbiBuKCl7dmFyIG49b2EudG91Y2hlcyhwKTtyZXR1cm4gZz1rLmssbi5mb3JFYWNoKGZ1bmN0aW9uKG4pe24uaWRlbnRpZmllciBpbiBkJiYoZFtuLmlkZW50aWZpZXJdPWUobikpfSksbn1mdW5jdGlvbiB0KCl7dmFyIHQ9b2EuZXZlbnQudGFyZ2V0O29hLnNlbGVjdCh0KS5vbih4LHIpLm9uKGIsbyksXy5wdXNoKHQpO2Zvcih2YXIgZT1vYS5ldmVudC5jaGFuZ2VkVG91Y2hlcyx1PTAsaT1lLmxlbmd0aDtpPnU7Kyt1KWRbZVt1XS5pZGVudGlmaWVyXT1udWxsO3ZhciBsPW4oKSxjPURhdGUubm93KCk7aWYoMT09PWwubGVuZ3RoKXtpZig1MDA+Yy1NKXt2YXIgcz1sWzBdO2EocCxzLGRbcy5pZGVudGlmaWVyXSxNYXRoLmZsb29yKE1hdGgubG9nKGsuaykvTWF0aC5MTjIpKzEpLFMoKX1NPWN9ZWxzZSBpZihsLmxlbmd0aD4xKXt2YXIgcz1sWzBdLGY9bFsxXSxoPXNbMF0tZlswXSxnPXNbMV0tZlsxXTttPWgqaCtnKmd9fWZ1bmN0aW9uIHIoKXt2YXIgbix0LGUscixhPW9hLnRvdWNoZXMocCk7T2wuY2FsbChwKTtmb3IodmFyIG89MCxsPWEubGVuZ3RoO2w+bzsrK28scj1udWxsKWlmKGU9YVtvXSxyPWRbZS5pZGVudGlmaWVyXSl7aWYodClicmVhaztuPWUsdD1yfWlmKHIpe3ZhciBzPShzPWVbMF0tblswXSkqcysocz1lWzFdLW5bMV0pKnMsZj1tJiZNYXRoLnNxcnQocy9tKTtuPVsoblswXStlWzBdKS8yLChuWzFdK2VbMV0pLzJdLHQ9Wyh0WzBdK3JbMF0pLzIsKHRbMV0rclsxXSkvMl0sdShmKmcpfU09bnVsbCxpKG4sdCksYyh2KX1mdW5jdGlvbiBvKCl7aWYob2EuZXZlbnQudG91Y2hlcy5sZW5ndGgpe2Zvcih2YXIgdD1vYS5ldmVudC5jaGFuZ2VkVG91Y2hlcyxlPTAscj10Lmxlbmd0aDtyPmU7KytlKWRlbGV0ZSBkW3RbZV0uaWRlbnRpZmllcl07Zm9yKHZhciB1IGluIGQpcmV0dXJuIHZvaWQgbigpfW9hLnNlbGVjdEFsbChfKS5vbih5LG51bGwpLHcub24oTCxmKS5vbihSLGgpLE4oKSxzKHYpfXZhciBnLHA9dGhpcyx2PUQub2YocCxhcmd1bWVudHMpLGQ9e30sbT0wLHk9Ii56b29tLSIrb2EuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcix4PSJ0b3VjaG1vdmUiK3ksYj0idG91Y2hlbmQiK3ksXz1bXSx3PW9hLnNlbGVjdChwKSxOPVcocCk7dCgpLGwodiksdy5vbihMLG51bGwpLm9uKFIsdCl9ZnVuY3Rpb24gZygpe3ZhciBuPUQub2YodGhpcyxhcmd1bWVudHMpO3k/Y2xlYXJUaW1lb3V0KHkpOihPbC5jYWxsKHRoaXMpLHY9ZShkPW18fG9hLm1vdXNlKHRoaXMpKSxsKG4pKSx5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt5PW51bGwscyhuKX0sNTApLFMoKSx1KE1hdGgucG93KDIsLjAwMipYYSgpKSprLmspLGkoZCx2KSxjKG4pfWZ1bmN0aW9uIHAoKXt2YXIgbj1vYS5tb3VzZSh0aGlzKSx0PU1hdGgubG9nKGsuaykvTWF0aC5MTjI7YSh0aGlzLG4sZShuKSxvYS5ldmVudC5zaGlmdEtleT9NYXRoLmNlaWwodCktMTpNYXRoLmZsb29yKHQpKzEpfXZhciB2LGQsbSx5LE0seCxiLF8sdyxrPXt4OjAseTowLGs6MX0sRT1bOTYwLDUwMF0sQT1CYSxDPTI1MCx6PTAsTD0ibW91c2Vkb3duLnpvb20iLHE9Im1vdXNlbW92ZS56b29tIixUPSJtb3VzZXVwLnpvb20iLFI9InRvdWNoc3RhcnQuem9vbSIsRD1OKG4sInpvb21zdGFydCIsInpvb20iLCJ6b29tZW5kIik7cmV0dXJuICRhfHwoJGE9Im9ud2hlZWwiaW4gc2E/KFhhPWZ1bmN0aW9uKCl7cmV0dXJuLW9hLmV2ZW50LmRlbHRhWSoob2EuZXZlbnQuZGVsdGFNb2RlPzEyMDoxKX0sIndoZWVsIik6Im9ubW91c2V3aGVlbCJpbiBzYT8oWGE9ZnVuY3Rpb24oKXtyZXR1cm4gb2EuZXZlbnQud2hlZWxEZWx0YX0sIm1vdXNld2hlZWwiKTooWGE9ZnVuY3Rpb24oKXtyZXR1cm4tb2EuZXZlbnQuZGV0YWlsfSwiTW96TW91c2VQaXhlbFNjcm9sbCIpKSxuLmV2ZW50PWZ1bmN0aW9uKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuPUQub2YodGhpcyxhcmd1bWVudHMpLHQ9aztGbD9vYS5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goInN0YXJ0Lnpvb20iLGZ1bmN0aW9uKCl7az10aGlzLl9fY2hhcnRfX3x8e3g6MCx5OjAsazoxfSxsKG4pfSkudHdlZW4oInpvb206em9vbSIsZnVuY3Rpb24oKXt2YXIgZT1FWzBdLHI9RVsxXSx1PWQ/ZFswXTplLzIsaT1kP2RbMV06ci8yLGE9b2EuaW50ZXJwb2xhdGVab29tKFsodS1rLngpL2suaywoaS1rLnkpL2suayxlL2sua10sWyh1LXQueCkvdC5rLChpLXQueSkvdC5rLGUvdC5rXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByPWEodCksbz1lL3JbMl07dGhpcy5fX2NoYXJ0X189az17eDp1LXJbMF0qbyx5OmktclsxXSpvLGs6b30sYyhuKX19KS5lYWNoKCJpbnRlcnJ1cHQuem9vbSIsZnVuY3Rpb24oKXtzKG4pfSkuZWFjaCgiZW5kLnpvb20iLGZ1bmN0aW9uKCl7cyhuKX0pOih0aGlzLl9fY2hhcnRfXz1rLGwobiksYyhuKSxzKG4pKX0pfSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz17eDordFswXSx5Oit0WzFdLGs6ay5rfSxvKCksbik6W2sueCxrLnldfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhrPXt4OmsueCx5OmsueSxrOm51bGx9LHUoK3QpLG8oKSxuKTprLmt9LG4uc2NhbGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEE9bnVsbD09dD9CYTpbK3RbMF0sK3RbMV1dLG4pOkF9LG4uY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPXQmJlsrdFswXSwrdFsxXV0sbik6bX0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhFPXQmJlsrdFswXSwrdFsxXV0sbik6RX0sbi5kdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQz0rdCxuKTpDfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9dCx4PXQuY29weSgpLGs9e3g6MCx5OjAsazoxfSxuKTpifSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHc9dCxfPXQuY29weSgpLGs9e3g6MCx5OjAsazoxfSxuKTp3fSxvYS5yZWJpbmQobixELCJvbiIpfTt2YXIgWGEsJGEsQmE9WzAsMS8wXTtvYS5jb2xvcj1vbixvbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKSsiIn0sb2EuaHNsPWxuO3ZhciBXYT1sbi5wcm90b3R5cGU9bmV3IG9uO1dhLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxuZXcgbG4odGhpcy5oLHRoaXMucyx0aGlzLmwvbil9LFdhLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSksbmV3IGxuKHRoaXMuaCx0aGlzLnMsbip0aGlzLmwpfSxXYS5yZ2I9ZnVuY3Rpb24oKXtyZXR1cm4gY24odGhpcy5oLHRoaXMucyx0aGlzLmwpfSxvYS5oY2w9c247dmFyIEphPXNuLnByb3RvdHlwZT1uZXcgb247SmEuYnJpZ2h0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIG5ldyBzbih0aGlzLmgsdGhpcy5jLE1hdGgubWluKDEwMCx0aGlzLmwrR2EqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSkpfSxKYS5kYXJrZXI9ZnVuY3Rpb24obil7cmV0dXJuIG5ldyBzbih0aGlzLmgsdGhpcy5jLE1hdGgubWF4KDAsdGhpcy5sLUdhKihhcmd1bWVudHMubGVuZ3RoP246MSkpKX0sSmEucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIGZuKHRoaXMuaCx0aGlzLmMsdGhpcy5sKS5yZ2IoKX0sb2EubGFiPWhuO3ZhciBHYT0xOCxLYT0uOTUwNDcsUWE9MSxubz0xLjA4ODgzLHRvPWhuLnByb3RvdHlwZT1uZXcgb247dG8uYnJpZ2h0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIG5ldyBobihNYXRoLm1pbigxMDAsdGhpcy5sK0dhKihhcmd1bWVudHMubGVuZ3RoP246MSkpLHRoaXMuYSx0aGlzLmIpfSx0by5kYXJrZXI9ZnVuY3Rpb24obil7cmV0dXJuIG5ldyBobihNYXRoLm1heCgwLHRoaXMubC1HYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSx0aGlzLmEsdGhpcy5iKX0sdG8ucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIGduKHRoaXMubCx0aGlzLmEsdGhpcy5iKX0sb2EucmdiPXluO3ZhciBlbz15bi5wcm90b3R5cGU9bmV3IG9uO2VvLmJyaWdodGVyPWZ1bmN0aW9uKG4pe249TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpO3ZhciB0PXRoaXMucixlPXRoaXMuZyxyPXRoaXMuYix1PTMwO3JldHVybiB0fHxlfHxyPyh0JiZ1PnQmJih0PXUpLGUmJnU+ZSYmKGU9dSksciYmdT5yJiYocj11KSxuZXcgeW4oTWF0aC5taW4oMjU1LHQvbiksTWF0aC5taW4oMjU1LGUvbiksTWF0aC5taW4oMjU1LHIvbikpKTpuZXcgeW4odSx1LHUpfSxlby5kYXJrZXI9ZnVuY3Rpb24obil7cmV0dXJuIG49TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpLG5ldyB5bihuKnRoaXMucixuKnRoaXMuZyxuKnRoaXMuYil9LGVvLmhzbD1mdW5jdGlvbigpe3JldHVybiB3bih0aGlzLnIsdGhpcy5nLHRoaXMuYil9LGVvLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIiMiK2JuKHRoaXMucikrYm4odGhpcy5nKStibih0aGlzLmIpfTt2YXIgcm89b2EubWFwKHthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9KTtyby5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7cm8uc2V0KG4sTW4odCkpfSksb2EuZnVuY3Rvcj1FbixvYS54aHI9QW4oeSksb2EuZHN2PWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuLGUsaSl7YXJndW1lbnRzLmxlbmd0aDwzJiYoaT1lLGU9bnVsbCk7dmFyIGE9Q24obix0LG51bGw9PWU/cjp1KGUpLGkpO3JldHVybiBhLnJvdz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9hLnJlc3BvbnNlKG51bGw9PShlPW4pP3I6dShuKSk6ZX0sYX1mdW5jdGlvbiByKG4pe3JldHVybiBlLnBhcnNlKG4ucmVzcG9uc2VUZXh0KX1mdW5jdGlvbiB1KG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5wYXJzZSh0LnJlc3BvbnNlVGV4dCxuKX19ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5tYXAoYSkuam9pbihuKX1mdW5jdGlvbiBhKG4pe3JldHVybiBvLnRlc3Qobik/JyInK24ucmVwbGFjZSgvXCIvZywnIiInKSsnIic6bn12YXIgbz1uZXcgUmVnRXhwKCdbIicrbisiXG5dIiksbD1uLmNoYXJDb2RlQXQoMCk7cmV0dXJuIGUucGFyc2U9ZnVuY3Rpb24obix0KXt2YXIgcjtyZXR1cm4gZS5wYXJzZVJvd3MobixmdW5jdGlvbihuLGUpe2lmKHIpcmV0dXJuIHIobixlLTEpO3ZhciB1PW5ldyBGdW5jdGlvbigiZCIsInJldHVybiB7IituLm1hcChmdW5jdGlvbihuLHQpe3JldHVybiBKU09OLnN0cmluZ2lmeShuKSsiOiBkWyIrdCsiXSJ9KS5qb2luKCIsIikrIn0iKTtyPXQ/ZnVuY3Rpb24obixlKXtyZXR1cm4gdCh1KG4pLGUpfTp1fSl9LGUucGFyc2VSb3dzPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZSgpe2lmKHM+PWMpcmV0dXJuIGE7aWYodSlyZXR1cm4gdT0hMSxpO3ZhciB0PXM7aWYoMzQ9PT1uLmNoYXJDb2RlQXQodCkpe2Zvcih2YXIgZT10O2UrKzxjOylpZigzND09PW4uY2hhckNvZGVBdChlKSl7aWYoMzQhPT1uLmNoYXJDb2RlQXQoZSsxKSlicmVhazsrK2V9cz1lKzI7dmFyIHI9bi5jaGFyQ29kZUF0KGUrMSk7cmV0dXJuIDEzPT09cj8odT0hMCwxMD09PW4uY2hhckNvZGVBdChlKzIpJiYrK3MpOjEwPT09ciYmKHU9ITApLG4uc2xpY2UodCsxLGUpLnJlcGxhY2UoLyIiL2csJyInKX1mb3IoO2M+czspe3ZhciByPW4uY2hhckNvZGVBdChzKyspLG89MTtpZigxMD09PXIpdT0hMDtlbHNlIGlmKDEzPT09cil1PSEwLDEwPT09bi5jaGFyQ29kZUF0KHMpJiYoKytzLCsrbyk7ZWxzZSBpZihyIT09bCljb250aW51ZTtyZXR1cm4gbi5zbGljZSh0LHMtbyl9cmV0dXJuIG4uc2xpY2UodCl9Zm9yKHZhciByLHUsaT17fSxhPXt9LG89W10sYz1uLmxlbmd0aCxzPTAsZj0wOyhyPWUoKSkhPT1hOyl7Zm9yKHZhciBoPVtdO3IhPT1pJiZyIT09YTspaC5wdXNoKHIpLHI9ZSgpO3QmJm51bGw9PShoPXQoaCxmKyspKXx8by5wdXNoKGgpfXJldHVybiBvfSxlLmZvcm1hdD1mdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHRbMF0pKXJldHVybiBlLmZvcm1hdFJvd3ModCk7dmFyIHI9bmV3IG0sdT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKG4pe2Zvcih2YXIgdCBpbiBuKXIuaGFzKHQpfHx1LnB1c2goci5hZGQodCkpfSksW3UubWFwKGEpLmpvaW4obildLmNvbmNhdCh0Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGEodFtuXSl9KS5qb2luKG4pfSkpLmpvaW4oIlxuIil9LGUuZm9ybWF0Um93cz1mdW5jdGlvbihuKXtyZXR1cm4gbi5tYXAoaSkuam9pbigiXG4iKX0sZX0sb2EuY3N2PW9hLmRzdigiLCIsInRleHQvY3N2Iiksb2EudHN2PW9hLmRzdigiCSIsInRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMiKTt2YXIgdW8saW8sYW8sb28sbG89dGhpc1t4KHRoaXMsInJlcXVlc3RBbmltYXRpb25GcmFtZSIpXXx8ZnVuY3Rpb24obil7c2V0VGltZW91dChuLDE3KX07b2EudGltZXI9ZnVuY3Rpb24oKXtxbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG9hLnRpbWVyLmZsdXNoPWZ1bmN0aW9uKCl7Um4oKSxEbigpfSxvYS5yb3VuZD1mdW5jdGlvbihuLHQpe3JldHVybiB0P01hdGgucm91bmQobioodD1NYXRoLnBvdygxMCx0KSkpL3Q6TWF0aC5yb3VuZChuKX07dmFyIGNvPVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiXHhiNSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdLm1hcChVbik7b2EuZm9ybWF0UHJlZml4PWZ1bmN0aW9uKG4sdCl7dmFyIGU9MDtyZXR1cm4obj0rbikmJigwPm4mJihuKj0tMSksdCYmKG49b2Eucm91bmQobixQbihuLHQpKSksZT0xK01hdGguZmxvb3IoMWUtMTIrTWF0aC5sb2cobikvTWF0aC5MTjEwKSxlPU1hdGgubWF4KC0yNCxNYXRoLm1pbigyNCwzKk1hdGguZmxvb3IoKGUtMSkvMykpKSksY29bOCtlLzNdfTt2YXIgc289Lyg/OihbXntdKT8oWzw+PV5dKSk/KFsrXC0gXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuLT9cZCspPyhbYS16JV0pPy9pLGZvPW9hLm1hcCh7YjpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygyKX0sYzpmdW5jdGlvbihuKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuKX0sbzpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZyg4KX0seDpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygxNil9LFg6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LGc6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b1ByZWNpc2lvbih0KX0sZTpmdW5jdGlvbihuLHQpe3JldHVybiBuLnRvRXhwb25lbnRpYWwodCl9LGY6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b0ZpeGVkKHQpfSxyOmZ1bmN0aW9uKG4sdCl7cmV0dXJuKG49b2Eucm91bmQobixQbihuLHQpKSkudG9GaXhlZChNYXRoLm1heCgwLE1hdGgubWluKDIwLFBuKG4qKDErMWUtMTUpLHQpKSkpfX0pLGhvPW9hLnRpbWU9e30sZ289RGF0ZTtIbi5wcm90b3R5cGU9e2dldERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0RhdGUoKX0sZ2V0RGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENEYXkoKX0sZ2V0RnVsbFllYXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0Z1bGxZZWFyKCl9LGdldEhvdXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENIb3VycygpfSxnZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ01pbGxpc2Vjb25kcygpfSxnZXRNaW51dGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNaW51dGVzKCl9LGdldE1vbnRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNb250aCgpfSxnZXRTZWNvbmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENTZWNvbmRzKCl9LGdldFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFRpbWUoKX0sZ2V0VGltZXpvbmVPZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8udmFsdWVPZigpfSxzZXREYXRlOmZ1bmN0aW9uKCl7cG8uc2V0VVRDRGF0ZS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0RGF5OmZ1bmN0aW9uKCl7cG8uc2V0VVRDRGF5LmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRGdWxsWWVhcjpmdW5jdGlvbigpe3BvLnNldFVUQ0Z1bGxZZWFyLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRIb3VyczpmdW5jdGlvbigpe3BvLnNldFVUQ0hvdXJzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtwby5zZXRVVENNaWxsaXNlY29uZHMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldE1pbnV0ZXM6ZnVuY3Rpb24oKXtwby5zZXRVVENNaW51dGVzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNb250aDpmdW5jdGlvbigpe3BvLnNldFVUQ01vbnRoLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRTZWNvbmRzOmZ1bmN0aW9uKCl7cG8uc2V0VVRDU2Vjb25kcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0VGltZTpmdW5jdGlvbigpe3BvLnNldFRpbWUuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9fTt2YXIgcG89RGF0ZS5wcm90b3R5cGU7aG8ueWVhcj1PbihmdW5jdGlvbihuKXtyZXR1cm4gbj1oby5kYXkobiksbi5zZXRNb250aCgwLDEpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEZ1bGxZZWFyKCl9KSxoby55ZWFycz1oby55ZWFyLnJhbmdlLGhvLnllYXJzLnV0Yz1oby55ZWFyLnV0Yy5yYW5nZSxoby5kYXk9T24oZnVuY3Rpb24obil7dmFyIHQ9bmV3IGdvKDJlMywwKTtyZXR1cm4gdC5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpKSx0fSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSt0KX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RGF0ZSgpLTF9KSxoby5kYXlzPWhvLmRheS5yYW5nZSxoby5kYXlzLnV0Yz1oby5kYXkudXRjLnJhbmdlLGhvLmRheU9mWWVhcj1mdW5jdGlvbihuKXt2YXIgdD1oby55ZWFyKG4pO3JldHVybiBNYXRoLmZsb29yKChuLXQtNmU0KihuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSkvODY0ZTUpfSxbInN1bmRheSIsIm1vbmRheSIsInR1ZXNkYXkiLCJ3ZWRuZXNkYXkiLCJ0aHVyc2RheSIsImZyaWRheSIsInNhdHVyZGF5Il0uZm9yRWFjaChmdW5jdGlvbihuLHQpe3Q9Ny10O3ZhciBlPWhvW25dPU9uKGZ1bmN0aW9uKG4pe3JldHVybihuPWhvLmRheShuKSkuc2V0RGF0ZShuLmdldERhdGUoKS0obi5nZXREYXkoKSt0KSU3KSxufSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSs3Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXt2YXIgZT1oby55ZWFyKG4pLmdldERheSgpO3JldHVybiBNYXRoLmZsb29yKChoby5kYXlPZlllYXIobikrKGUrdCklNykvNyktKGUhPT10KX0pO2hvW24rInMiXT1lLnJhbmdlLGhvW24rInMiXS51dGM9ZS51dGMucmFuZ2UsaG9bbisiT2ZZZWFyIl09ZnVuY3Rpb24obil7dmFyIGU9aG8ueWVhcihuKS5nZXREYXkoKTtyZXR1cm4gTWF0aC5mbG9vcigoaG8uZGF5T2ZZZWFyKG4pKyhlK3QpJTcpLzcpfX0pLGhvLndlZWs9aG8uc3VuZGF5LGhvLndlZWtzPWhvLnN1bmRheS5yYW5nZSxoby53ZWVrcy51dGM9aG8uc3VuZGF5LnV0Yy5yYW5nZSxoby53ZWVrT2ZZZWFyPWhvLnN1bmRheU9mWWVhcjt2YXIgdm89eyItIjoiIixfOiIgIiwwOiIwIn0sbW89L15ccypcZCsvLHlvPS9eJS87b2EubG9jYWxlPWZ1bmN0aW9uKG4pe3JldHVybntudW1iZXJGb3JtYXQ6am4obiksdGltZUZvcm1hdDpZbihuKX19O3ZhciBNbz1vYS5sb2NhbGUoe2RlY2ltYWw6Ii4iLHRob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdLGRhdGVUaW1lOiIlYSAlYiAlZSAlWCAlWSIsZGF0ZToiJW0vJWQvJVkiLHRpbWU6IiVIOiVNOiVTIixwZXJpb2RzOlsiQU0iLCJQTSJdLGRheXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLApzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTtvYS5mb3JtYXQ9TW8ubnVtYmVyRm9ybWF0LG9hLmdlbz17fSxzdC5wcm90b3R5cGU9e3M6MCx0OjAsYWRkOmZ1bmN0aW9uKG4pe2Z0KG4sdGhpcy50LHhvKSxmdCh4by5zLHRoaXMucyx0aGlzKSx0aGlzLnM/dGhpcy50Kz14by50OnRoaXMucz14by50fSxyZXNldDpmdW5jdGlvbigpe3RoaXMucz10aGlzLnQ9MH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgeG89bmV3IHN0O29hLmdlby5zdHJlYW09ZnVuY3Rpb24obix0KXtuJiZiby5oYXNPd25Qcm9wZXJ0eShuLnR5cGUpP2JvW24udHlwZV0obix0KTpodChuLHQpfTt2YXIgYm89e0ZlYXR1cmU6ZnVuY3Rpb24obix0KXtodChuLmdlb21ldHJ5LHQpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmZlYXR1cmVzLHI9LTEsdT1lLmxlbmd0aDsrK3I8dTspaHQoZVtyXS5nZW9tZXRyeSx0KX19LF9vPXtTcGhlcmU6ZnVuY3Rpb24obix0KXt0LnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbihuLHQpe249bi5jb29yZGluYXRlcyx0LnBvaW50KG5bMF0sblsxXSxuWzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmNvb3JkaW5hdGVzLHI9LTEsdT1lLmxlbmd0aDsrK3I8dTspbj1lW3JdLHQucG9pbnQoblswXSxuWzFdLG5bMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKG4sdCl7Z3Qobi5jb29yZGluYXRlcyx0LDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KWd0KGVbcl0sdCwwKX0sUG9seWdvbjpmdW5jdGlvbihuLHQpe3B0KG4uY29vcmRpbmF0ZXMsdCl9LE11bHRpUG9seWdvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmNvb3JkaW5hdGVzLHI9LTEsdT1lLmxlbmd0aDsrK3I8dTspcHQoZVtyXSx0KX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uZ2VvbWV0cmllcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KWh0KGVbcl0sdCl9fTtvYS5nZW8uYXJlYT1mdW5jdGlvbihuKXtyZXR1cm4gd289MCxvYS5nZW8uc3RyZWFtKG4sa28pLHdvfTt2YXIgd28sU289bmV3IHN0LGtvPXtzcGhlcmU6ZnVuY3Rpb24oKXt3bys9NCpVYX0scG9pbnQ6YixsaW5lU3RhcnQ6YixsaW5lRW5kOmIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7U28ucmVzZXQoKSxrby5saW5lU3RhcnQ9dnR9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgbj0yKlNvO3dvKz0wPm4/NCpVYStuOm4sa28ubGluZVN0YXJ0PWtvLmxpbmVFbmQ9a28ucG9pbnQ9Yn19O29hLmdlby5ib3VuZHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sdCl7TS5wdXNoKHg9W3M9bixoPW5dKSxmPnQmJihmPXQpLHQ+ZyYmKGc9dCl9ZnVuY3Rpb24gdCh0LGUpe3ZhciByPWR0KFt0Kk9hLGUqT2FdKTtpZihtKXt2YXIgdT15dChtLHIpLGk9W3VbMV0sLXVbMF0sMF0sYT15dChpLHUpO2J0KGEpLGE9X3QoYSk7dmFyIGw9dC1wLGM9bD4wPzE6LTEsdj1hWzBdKklhKmMsZD1NYShsKT4xODA7aWYoZF4odj5jKnAmJmMqdD52KSl7dmFyIHk9YVsxXSpJYTt5PmcmJihnPXkpfWVsc2UgaWYodj0odiszNjApJTM2MC0xODAsZF4odj5jKnAmJmMqdD52KSl7dmFyIHk9LWFbMV0qSWE7Zj55JiYoZj15KX1lbHNlIGY+ZSYmKGY9ZSksZT5nJiYoZz1lKTtkP3A+dD9vKHMsdCk+byhzLGgpJiYoaD10KTpvKHQsaCk+byhzLGgpJiYocz10KTpoPj1zPyhzPnQmJihzPXQpLHQ+aCYmKGg9dCkpOnQ+cD9vKHMsdCk+byhzLGgpJiYoaD10KTpvKHQsaCk+byhzLGgpJiYocz10KX1lbHNlIG4odCxlKTttPXIscD10fWZ1bmN0aW9uIGUoKXtiLnBvaW50PXR9ZnVuY3Rpb24gcigpe3hbMF09cyx4WzFdPWgsYi5wb2ludD1uLG09bnVsbH1mdW5jdGlvbiB1KG4sZSl7aWYobSl7dmFyIHI9bi1wO3krPU1hKHIpPjE4MD9yKyhyPjA/MzYwOi0zNjApOnJ9ZWxzZSB2PW4sZD1lO2tvLnBvaW50KG4sZSksdChuLGUpfWZ1bmN0aW9uIGkoKXtrby5saW5lU3RhcnQoKX1mdW5jdGlvbiBhKCl7dSh2LGQpLGtvLmxpbmVFbmQoKSxNYSh5KT5EYSYmKHM9LShoPTE4MCkpLHhbMF09cyx4WzFdPWgsbT1udWxsfWZ1bmN0aW9uIG8obix0KXtyZXR1cm4odC09bik8MD90KzM2MDp0fWZ1bmN0aW9uIGwobix0KXtyZXR1cm4gblswXS10WzBdfWZ1bmN0aW9uIGMobix0KXtyZXR1cm4gdFswXTw9dFsxXT90WzBdPD1uJiZuPD10WzFdOm48dFswXXx8dFsxXTxufXZhciBzLGYsaCxnLHAsdixkLG0seSxNLHgsYj17cG9pbnQ6bixsaW5lU3RhcnQ6ZSxsaW5lRW5kOnIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Yi5wb2ludD11LGIubGluZVN0YXJ0PWksYi5saW5lRW5kPWEseT0wLGtvLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7a28ucG9seWdvbkVuZCgpLGIucG9pbnQ9bixiLmxpbmVTdGFydD1lLGIubGluZUVuZD1yLDA+U28/KHM9LShoPTE4MCksZj0tKGc9OTApKTp5PkRhP2c9OTA6LURhPnkmJihmPS05MCkseFswXT1zLHhbMV09aH19O3JldHVybiBmdW5jdGlvbihuKXtnPWg9LShzPWY9MS8wKSxNPVtdLG9hLmdlby5zdHJlYW0obixiKTt2YXIgdD1NLmxlbmd0aDtpZih0KXtNLnNvcnQobCk7Zm9yKHZhciBlLHI9MSx1PU1bMF0saT1bdV07dD5yOysrcillPU1bcl0sYyhlWzBdLHUpfHxjKGVbMV0sdSk/KG8odVswXSxlWzFdKT5vKHVbMF0sdVsxXSkmJih1WzFdPWVbMV0pLG8oZVswXSx1WzFdKT5vKHVbMF0sdVsxXSkmJih1WzBdPWVbMF0pKTppLnB1c2godT1lKTtmb3IodmFyIGEsZSxwPS0oMS8wKSx0PWkubGVuZ3RoLTEscj0wLHU9aVt0XTt0Pj1yO3U9ZSwrK3IpZT1pW3JdLChhPW8odVsxXSxlWzBdKSk+cCYmKHA9YSxzPWVbMF0saD11WzFdKX1yZXR1cm4gTT14PW51bGwscz09PTEvMHx8Zj09PTEvMD9bW05hTixOYU5dLFtOYU4sTmFOXV06W1tzLGZdLFtoLGddXX19KCksb2EuZ2VvLmNlbnRyb2lkPWZ1bmN0aW9uKG4pe05vPUVvPUFvPUNvPXpvPUxvPXFvPVRvPVJvPURvPVBvPTAsb2EuZ2VvLnN0cmVhbShuLFVvKTt2YXIgdD1SbyxlPURvLHI9UG8sdT10KnQrZSplK3IqcjtyZXR1cm4gUGE+dSYmKHQ9TG8sZT1xbyxyPVRvLERhPkVvJiYodD1BbyxlPUNvLHI9em8pLHU9dCp0K2UqZStyKnIsUGE+dSk/W05hTixOYU5dOltNYXRoLmF0YW4yKGUsdCkqSWEsdG4oci9NYXRoLnNxcnQodSkpKklhXX07dmFyIE5vLEVvLEFvLENvLHpvLExvLHFvLFRvLFJvLERvLFBvLFVvPXtzcGhlcmU6Yixwb2ludDpTdCxsaW5lU3RhcnQ6TnQsbGluZUVuZDpFdCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtVby5saW5lU3RhcnQ9QXR9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtVby5saW5lU3RhcnQ9TnR9fSxqbz1SdCh6dCxqdCxIdCxbLVVhLC1VYS8yXSksRm89MWU5O29hLmdlby5jbGlwRXh0ZW50PWZ1bmN0aW9uKCl7dmFyIG4sdCxlLHIsdSxpLGE9e3N0cmVhbTpmdW5jdGlvbihuKXtyZXR1cm4gdSYmKHUudmFsaWQ9ITEpLHU9aShuKSx1LnZhbGlkPSEwLHV9LGV4dGVudDpmdW5jdGlvbihvKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1adChuPStvWzBdWzBdLHQ9K29bMF1bMV0sZT0rb1sxXVswXSxyPStvWzFdWzFdKSx1JiYodS52YWxpZD0hMSx1PW51bGwpLGEpOltbbix0XSxbZSxyXV19fTtyZXR1cm4gYS5leHRlbnQoW1swLDBdLFs5NjAsNTAwXV0pfSwob2EuZ2VvLmNvbmljRXF1YWxBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIFZ0KFh0KX0pLnJhdz1YdCxvYS5nZW8uYWxiZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIG9hLmdlby5jb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbOTYsMF0pLmNlbnRlcihbLS42LDM4LjddKS5wYXJhbGxlbHMoWzI5LjUsNDUuNV0pLnNjYWxlKDEwNzApfSxvYS5nZW8uYWxiZXJzVXNhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXt2YXIgaT1uWzBdLGE9blsxXTtyZXR1cm4gdD1udWxsLGUoaSxhKSx0fHwocihpLGEpLHQpfHx1KGksYSksdH12YXIgdCxlLHIsdSxpPW9hLmdlby5hbGJlcnMoKSxhPW9hLmdlby5jb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbMTU0LDBdKS5jZW50ZXIoWy0yLDU4LjVdKS5wYXJhbGxlbHMoWzU1LDY1XSksbz1vYS5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzE1NywwXSkuY2VudGVyKFstMywxOS45XSkucGFyYWxsZWxzKFs4LDE4XSksbD17cG9pbnQ6ZnVuY3Rpb24obixlKXt0PVtuLGVdfX07cmV0dXJuIG4uaW52ZXJ0PWZ1bmN0aW9uKG4pe3ZhciB0PWkuc2NhbGUoKSxlPWkudHJhbnNsYXRlKCkscj0oblswXS1lWzBdKS90LHU9KG5bMV0tZVsxXSkvdDtyZXR1cm4odT49LjEyJiYuMjM0PnUmJnI+PS0uNDI1JiYtLjIxND5yP2E6dT49LjE2NiYmLjIzND51JiZyPj0tLjIxNCYmLS4xMTU+cj9vOmkpLmludmVydChuKX0sbi5zdHJlYW09ZnVuY3Rpb24obil7dmFyIHQ9aS5zdHJlYW0obiksZT1hLnN0cmVhbShuKSxyPW8uc3RyZWFtKG4pO3JldHVybntwb2ludDpmdW5jdGlvbihuLHUpe3QucG9pbnQobix1KSxlLnBvaW50KG4sdSksci5wb2ludChuLHUpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0LnNwaGVyZSgpLGUuc3BoZXJlKCksci5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxlLmxpbmVTdGFydCgpLHIubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0LmxpbmVFbmQoKSxlLmxpbmVFbmQoKSxyLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dC5wb2x5Z29uU3RhcnQoKSxlLnBvbHlnb25TdGFydCgpLHIucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25FbmQoKSxlLnBvbHlnb25FbmQoKSxyLnBvbHlnb25FbmQoKX19fSxuLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaS5wcmVjaXNpb24odCksYS5wcmVjaXNpb24odCksby5wcmVjaXNpb24odCksbik6aS5wcmVjaXNpb24oKX0sbi5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaS5zY2FsZSh0KSxhLnNjYWxlKC4zNSp0KSxvLnNjYWxlKHQpLG4udHJhbnNsYXRlKGkudHJhbnNsYXRlKCkpKTppLnNjYWxlKCl9LG4udHJhbnNsYXRlPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBpLnRyYW5zbGF0ZSgpO3ZhciBjPWkuc2NhbGUoKSxzPSt0WzBdLGY9K3RbMV07cmV0dXJuIGU9aS50cmFuc2xhdGUodCkuY2xpcEV4dGVudChbW3MtLjQ1NSpjLGYtLjIzOCpjXSxbcysuNDU1KmMsZisuMjM4KmNdXSkuc3RyZWFtKGwpLnBvaW50LHI9YS50cmFuc2xhdGUoW3MtLjMwNypjLGYrLjIwMSpjXSkuY2xpcEV4dGVudChbW3MtLjQyNSpjK0RhLGYrLjEyKmMrRGFdLFtzLS4yMTQqYy1EYSxmKy4yMzQqYy1EYV1dKS5zdHJlYW0obCkucG9pbnQsdT1vLnRyYW5zbGF0ZShbcy0uMjA1KmMsZisuMjEyKmNdKS5jbGlwRXh0ZW50KFtbcy0uMjE0KmMrRGEsZisuMTY2KmMrRGFdLFtzLS4xMTUqYy1EYSxmKy4yMzQqYy1EYV1dKS5zdHJlYW0obCkucG9pbnQsbn0sbi5zY2FsZSgxMDcwKX07dmFyIEhvLE9vLElvLFlvLFpvLFZvLFhvPXtwb2ludDpiLGxpbmVTdGFydDpiLGxpbmVFbmQ6Yixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtPbz0wLFhvLmxpbmVTdGFydD0kdH0scG9seWdvbkVuZDpmdW5jdGlvbigpe1hvLmxpbmVTdGFydD1Yby5saW5lRW5kPVhvLnBvaW50PWIsSG8rPU1hKE9vLzIpfX0sJG89e3BvaW50OkJ0LGxpbmVTdGFydDpiLGxpbmVFbmQ6Yixwb2x5Z29uU3RhcnQ6Yixwb2x5Z29uRW5kOmJ9LEJvPXtwb2ludDpHdCxsaW5lU3RhcnQ6S3QsbGluZUVuZDpRdCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtCby5saW5lU3RhcnQ9bmV9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtCby5wb2ludD1HdCxCby5saW5lU3RhcnQ9S3QsQm8ubGluZUVuZD1RdH19O29hLmdlby5wYXRoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbiYmKCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZpLnBvaW50UmFkaXVzKCtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksYSYmYS52YWxpZHx8KGE9dShpKSksb2EuZ2VvLnN0cmVhbShuLGEpKSxpLnJlc3VsdCgpfWZ1bmN0aW9uIHQoKXtyZXR1cm4gYT1udWxsLG59dmFyIGUscix1LGksYSxvPTQuNTtyZXR1cm4gbi5hcmVhPWZ1bmN0aW9uKG4pe3JldHVybiBIbz0wLG9hLmdlby5zdHJlYW0obix1KFhvKSksSG99LG4uY2VudHJvaWQ9ZnVuY3Rpb24obil7cmV0dXJuIEFvPUNvPXpvPUxvPXFvPVRvPVJvPURvPVBvPTAsb2EuZ2VvLnN0cmVhbShuLHUoQm8pKSxQbz9bUm8vUG8sRG8vUG9dOlRvP1tMby9Ubyxxby9Ub106em8/W0FvL3pvLENvL3pvXTpbTmFOLE5hTl19LG4uYm91bmRzPWZ1bmN0aW9uKG4pe3JldHVybiBabz1Wbz0tKElvPVlvPTEvMCksb2EuZ2VvLnN0cmVhbShuLHUoJG8pKSxbW0lvLFlvXSxbWm8sVm9dXX0sbi5wcm9qZWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PShlPW4pP24uc3RyZWFtfHxyZShuKTp5LHQoKSk6ZX0sbi5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PShyPW4pP25ldyBXdDpuZXcgdGUobiksImZ1bmN0aW9uIiE9dHlwZW9mIG8mJmkucG9pbnRSYWRpdXMobyksdCgpKTpyfSxuLnBvaW50UmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6KGkucG9pbnRSYWRpdXMoK3QpLCt0KSxuKTpvfSxuLnByb2plY3Rpb24ob2EuZ2VvLmFsYmVyc1VzYSgpKS5jb250ZXh0KG51bGwpfSxvYS5nZW8udHJhbnNmb3JtPWZ1bmN0aW9uKG4pe3JldHVybntzdHJlYW06ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHVlKHQpO2Zvcih2YXIgciBpbiBuKWVbcl09bltyXTtyZXR1cm4gZX19fSx1ZS5wcm90b3R5cGU9e3BvaW50OmZ1bmN0aW9uKG4sdCl7dGhpcy5zdHJlYW0ucG9pbnQobix0KX0sc3BoZXJlOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25FbmQoKX19LG9hLmdlby5wcm9qZWN0aW9uPWFlLG9hLmdlby5wcm9qZWN0aW9uTXV0YXRvcj1vZSwob2EuZ2VvLmVxdWlyZWN0YW5ndWxhcj1mdW5jdGlvbigpe3JldHVybiBhZShjZSl9KS5yYXc9Y2UuaW52ZXJ0PWNlLG9hLmdlby5yb3RhdGlvbj1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KHQpe3JldHVybiB0PW4odFswXSpPYSx0WzFdKk9hKSx0WzBdKj1JYSx0WzFdKj1JYSx0fXJldHVybiBuPWZlKG5bMF0lMzYwKk9hLG5bMV0qT2Esbi5sZW5ndGg+Mj9uWzJdKk9hOjApLHQuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0PW4uaW52ZXJ0KHRbMF0qT2EsdFsxXSpPYSksdFswXSo9SWEsdFsxXSo9SWEsdH0sdH0sc2UuaW52ZXJ0PWNlLG9hLmdlby5jaXJjbGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6cix0PWZlKC1uWzBdKk9hLC1uWzFdKk9hLDApLmludmVydCx1PVtdO3JldHVybiBlKG51bGwsbnVsbCwxLHtwb2ludDpmdW5jdGlvbihuLGUpe3UucHVzaChuPXQobixlKSksblswXSo9SWEsblsxXSo9SWF9fSkse3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOlt1XX19dmFyIHQsZSxyPVswLDBdLHU9NjtyZXR1cm4gbi5vcmlnaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxuLmFuZ2xlPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXZlKCh0PStyKSpPYSx1Kk9hKSxuKTp0fSxuLnByZWNpc2lvbj1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT12ZSh0Kk9hLCh1PStyKSpPYSksbik6dX0sbi5hbmdsZSg5MCl9LG9hLmdlby5kaXN0YW5jZT1mdW5jdGlvbihuLHQpe3ZhciBlLHI9KHRbMF0tblswXSkqT2EsdT1uWzFdKk9hLGk9dFsxXSpPYSxhPU1hdGguc2luKHIpLG89TWF0aC5jb3MociksbD1NYXRoLnNpbih1KSxjPU1hdGguY29zKHUpLHM9TWF0aC5zaW4oaSksZj1NYXRoLmNvcyhpKTtyZXR1cm4gTWF0aC5hdGFuMihNYXRoLnNxcnQoKGU9ZiphKSplKyhlPWMqcy1sKmYqbykqZSksbCpzK2MqZipvKX0sb2EuZ2VvLmdyYXRpY3VsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXtyZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczp0KCl9fWZ1bmN0aW9uIHQoKXtyZXR1cm4gb2EucmFuZ2UoTWF0aC5jZWlsKGkvZCkqZCx1LGQpLm1hcChoKS5jb25jYXQob2EucmFuZ2UoTWF0aC5jZWlsKGMvbSkqbSxsLG0pLm1hcChnKSkuY29uY2F0KG9hLnJhbmdlKE1hdGguY2VpbChyL3ApKnAsZSxwKS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIE1hKG4lZCk+RGF9KS5tYXAocykpLmNvbmNhdChvYS5yYW5nZShNYXRoLmNlaWwoby92KSp2LGEsdikuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiBNYShuJW0pPkRhfSkubWFwKGYpKX12YXIgZSxyLHUsaSxhLG8sbCxjLHMsZixoLGcscD0xMCx2PXAsZD05MCxtPTM2MCx5PTIuNTtyZXR1cm4gbi5saW5lcz1mdW5jdGlvbigpe3JldHVybiB0KCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpufX0pfSxuLm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W2goaSkuY29uY2F0KGcobCkuc2xpY2UoMSksaCh1KS5yZXZlcnNlKCkuc2xpY2UoMSksZyhjKS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LG4uZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24ubWFqb3JFeHRlbnQodCkubWlub3JFeHRlbnQodCk6bi5taW5vckV4dGVudCgpfSxuLm1ham9yRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0WzBdWzBdLHU9K3RbMV1bMF0sYz0rdFswXVsxXSxsPSt0WzFdWzFdLGk+dSYmKHQ9aSxpPXUsdT10KSxjPmwmJih0PWMsYz1sLGw9dCksbi5wcmVjaXNpb24oeSkpOltbaSxjXSxbdSxsXV19LG4ubWlub3JFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3RbMF1bMF0sZT0rdFsxXVswXSxvPSt0WzBdWzFdLGE9K3RbMV1bMV0scj5lJiYodD1yLHI9ZSxlPXQpLG8+YSYmKHQ9byxvPWEsYT10KSxuLnByZWNpc2lvbih5KSk6W1tyLG9dLFtlLGFdXX0sbi5zdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24ubWFqb3JTdGVwKHQpLm1pbm9yU3RlcCh0KTpuLm1pbm9yU3RlcCgpfSxuLm1ham9yU3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD0rdFswXSxtPSt0WzFdLG4pOltkLG1dfSxuLm1pbm9yU3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rdFswXSx2PSt0WzFdLG4pOltwLHZdfSxuLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0rdCxzPW1lKG8sYSw5MCksZj15ZShyLGUseSksaD1tZShjLGwsOTApLGc9eWUoaSx1LHkpLG4pOnl9LG4ubWFqb3JFeHRlbnQoW1stMTgwLC05MCtEYV0sWzE4MCw5MC1EYV1dKS5taW5vckV4dGVudChbWy0xODAsLTgwLURhXSxbMTgwLDgwK0RhXV0pfSxvYS5nZW8uZ3JlYXRBcmM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOlt0fHxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlfHx1LmFwcGx5KHRoaXMsYXJndW1lbnRzKV19fXZhciB0LGUscj1NZSx1PXhlO3JldHVybiBuLmRpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIG9hLmdlby5kaXN0YW5jZSh0fHxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlfHx1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LG4uc291cmNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWUsdD0iZnVuY3Rpb24iPT10eXBlb2YgZT9udWxsOmUsbik6cn0sbi50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P251bGw6dCxuKTp1fSxuLnByZWNpc2lvbj1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP246MH0sbn0sb2EuZ2VvLmludGVycG9sYXRlPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGJlKG5bMF0qT2EsblsxXSpPYSx0WzBdKk9hLHRbMV0qT2EpfSxvYS5nZW8ubGVuZ3RoPWZ1bmN0aW9uKG4pe3JldHVybiBXbz0wLG9hLmdlby5zdHJlYW0obixKbyksV299O3ZhciBXbyxKbz17c3BoZXJlOmIscG9pbnQ6YixsaW5lU3RhcnQ6X2UsbGluZUVuZDpiLHBvbHlnb25TdGFydDpiLHBvbHlnb25FbmQ6Yn0sR289d2UoZnVuY3Rpb24obil7cmV0dXJuIE1hdGguc3FydCgyLygxK24pKX0sZnVuY3Rpb24obil7cmV0dXJuIDIqTWF0aC5hc2luKG4vMil9KTsob2EuZ2VvLmF6aW11dGhhbEVxdWFsQXJlYT1mdW5jdGlvbigpe3JldHVybiBhZShHbyl9KS5yYXc9R287dmFyIEtvPXdlKGZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguYWNvcyhuKTtyZXR1cm4gdCYmdC9NYXRoLnNpbih0KX0seSk7KG9hLmdlby5hemltdXRoYWxFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiBhZShLbyl9KS5yYXc9S28sKG9hLmdlby5jb25pY0NvbmZvcm1hbD1mdW5jdGlvbigpe3JldHVybiBWdChTZSl9KS5yYXc9U2UsKG9hLmdlby5jb25pY0VxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIFZ0KGtlKX0pLnJhdz1rZTt2YXIgUW89d2UoZnVuY3Rpb24obil7cmV0dXJuIDEvbn0sTWF0aC5hdGFuKTsob2EuZ2VvLmdub21vbmljPWZ1bmN0aW9uKCl7cmV0dXJuIGFlKFFvKX0pLnJhdz1RbyxOZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm5bbiwyKk1hdGguYXRhbihNYXRoLmV4cCh0KSktSGFdfSwob2EuZ2VvLm1lcmNhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIEVlKE5lKX0pLnJhdz1OZTt2YXIgbmw9d2UoZnVuY3Rpb24oKXtyZXR1cm4gMX0sTWF0aC5hc2luKTsob2EuZ2VvLm9ydGhvZ3JhcGhpYz1mdW5jdGlvbigpe3JldHVybiBhZShubCl9KS5yYXc9bmw7dmFyIHRsPXdlKGZ1bmN0aW9uKG4pe3JldHVybiAxLygxK24pfSxmdW5jdGlvbihuKXtyZXR1cm4gMipNYXRoLmF0YW4obil9KTsob2EuZ2VvLnN0ZXJlb2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gYWUodGwpfSkucmF3PXRsLEFlLmludmVydD1mdW5jdGlvbihuLHQpe3JldHVyblstdCwyKk1hdGguYXRhbihNYXRoLmV4cChuKSktSGFdfSwob2EuZ2VvLnRyYW5zdmVyc2VNZXJjYXRvcj1mdW5jdGlvbigpe3ZhciBuPUVlKEFlKSx0PW4uY2VudGVyLGU9bi5yb3RhdGU7cmV0dXJuIG4uY2VudGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuP3QoWy1uWzFdLG5bMF1dKToobj10KCksW25bMV0sLW5bMF1dKX0sbi5yb3RhdGU9ZnVuY3Rpb24obil7cmV0dXJuIG4/ZShbblswXSxuWzFdLG4ubGVuZ3RoPjI/blsyXSs5MDo5MF0pOihuPWUoKSxbblswXSxuWzFdLG5bMl0tOTBdKX0sZShbMCwwLDkwXSl9KS5yYXc9QWUsb2EuZ2VvbT17fSxvYS5nZW9tLmh1bGw9ZnVuY3Rpb24obil7ZnVuY3Rpb24gdChuKXtpZihuLmxlbmd0aDwzKXJldHVybltdO3ZhciB0LHU9RW4oZSksaT1FbihyKSxhPW4ubGVuZ3RoLG89W10sbD1bXTtmb3IodD0wO2E+dDt0Kyspby5wdXNoKFsrdS5jYWxsKHRoaXMsblt0XSx0KSwraS5jYWxsKHRoaXMsblt0XSx0KSx0XSk7Zm9yKG8uc29ydChxZSksdD0wO2E+dDt0KyspbC5wdXNoKFtvW3RdWzBdLC1vW3RdWzFdXSk7dmFyIGM9TGUobykscz1MZShsKSxmPXNbMF09PT1jWzBdLGg9c1tzLmxlbmd0aC0xXT09PWNbYy5sZW5ndGgtMV0sZz1bXTtmb3IodD1jLmxlbmd0aC0xO3Q+PTA7LS10KWcucHVzaChuW29bY1t0XV1bMl1dKTtmb3IodD0rZjt0PHMubGVuZ3RoLWg7Kyt0KWcucHVzaChuW29bc1t0XV1bMl1dKTtyZXR1cm4gZ312YXIgZT1DZSxyPXplO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Qobik6KHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHQpOnJ9LHQpfSxvYS5nZW9tLnBvbHlnb249ZnVuY3Rpb24obil7cmV0dXJuIFNhKG4sZWwpLG59O3ZhciBlbD1vYS5nZW9tLnBvbHlnb24ucHJvdG90eXBlPVtdO2VsLmFyZWE9ZnVuY3Rpb24oKXtmb3IodmFyIG4sdD0tMSxlPXRoaXMubGVuZ3RoLHI9dGhpc1tlLTFdLHU9MDsrK3Q8ZTspbj1yLHI9dGhpc1t0XSx1Kz1uWzFdKnJbMF0tblswXSpyWzFdO3JldHVybi41KnV9LGVsLmNlbnRyb2lkPWZ1bmN0aW9uKG4pe3ZhciB0LGUscj0tMSx1PXRoaXMubGVuZ3RoLGk9MCxhPTAsbz10aGlzW3UtMV07Zm9yKGFyZ3VtZW50cy5sZW5ndGh8fChuPS0xLyg2KnRoaXMuYXJlYSgpKSk7KytyPHU7KXQ9byxvPXRoaXNbcl0sZT10WzBdKm9bMV0tb1swXSp0WzFdLGkrPSh0WzBdK29bMF0pKmUsYSs9KHRbMV0rb1sxXSkqZTtyZXR1cm5baSpuLGEqbl19LGVsLmNsaXA9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1LGksYSxvPURlKG4pLGw9LTEsYz10aGlzLmxlbmd0aC1EZSh0aGlzKSxzPXRoaXNbYy0xXTsrK2w8Yzspe2Zvcih0PW4uc2xpY2UoKSxuLmxlbmd0aD0wLHU9dGhpc1tsXSxpPXRbKHI9dC5sZW5ndGgtbyktMV0sZT0tMTsrK2U8cjspYT10W2VdLFRlKGEscyx1KT8oVGUoaSxzLHUpfHxuLnB1c2goUmUoaSxhLHMsdSkpLG4ucHVzaChhKSk6VGUoaSxzLHUpJiZuLnB1c2goUmUoaSxhLHMsdSkpLGk9YTtvJiZuLnB1c2goblswXSkscz11fXJldHVybiBufTt2YXIgcmwsdWwsaWwsYWwsb2wsbGw9W10sY2w9W107WWUucHJvdG90eXBlLnByZXBhcmU9ZnVuY3Rpb24oKXtmb3IodmFyIG4sdD10aGlzLmVkZ2VzLGU9dC5sZW5ndGg7ZS0tOyluPXRbZV0uZWRnZSxuLmImJm4uYXx8dC5zcGxpY2UoZSwxKTtyZXR1cm4gdC5zb3J0KFZlKSx0Lmxlbmd0aH0sdHIucHJvdG90eXBlPXtzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2UubD09PXRoaXMuc2l0ZT90aGlzLmVkZ2UuYTp0aGlzLmVkZ2UuYn0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZS5sPT09dGhpcy5zaXRlP3RoaXMuZWRnZS5iOnRoaXMuZWRnZS5hfX0sZXIucHJvdG90eXBlPXtpbnNlcnQ6ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU7aWYobil7aWYodC5QPW4sdC5OPW4uTixuLk4mJihuLk4uUD10KSxuLk49dCxuLlIpe2ZvcihuPW4uUjtuLkw7KW49bi5MO24uTD10fWVsc2Ugbi5SPXQ7ZT1ufWVsc2UgdGhpcy5fPyhuPWFyKHRoaXMuXyksdC5QPW51bGwsdC5OPW4sbi5QPW4uTD10LGU9bik6KHQuUD10Lk49bnVsbCx0aGlzLl89dCxlPW51bGwpO2Zvcih0Lkw9dC5SPW51bGwsdC5VPWUsdC5DPSEwLG49dDtlJiZlLkM7KXI9ZS5VLGU9PT1yLkw/KHU9ci5SLHUmJnUuQz8oZS5DPXUuQz0hMSxyLkM9ITAsbj1yKToobj09PWUuUiYmKHVyKHRoaXMsZSksbj1lLGU9bi5VKSxlLkM9ITEsci5DPSEwLGlyKHRoaXMscikpKToodT1yLkwsdSYmdS5DPyhlLkM9dS5DPSExLHIuQz0hMCxuPXIpOihuPT09ZS5MJiYoaXIodGhpcyxlKSxuPWUsZT1uLlUpLGUuQz0hMSxyLkM9ITAsdXIodGhpcyxyKSkpLGU9bi5VO3RoaXMuXy5DPSExfSxyZW1vdmU6ZnVuY3Rpb24obil7bi5OJiYobi5OLlA9bi5QKSxuLlAmJihuLlAuTj1uLk4pLG4uTj1uLlA9bnVsbDt2YXIgdCxlLHIsdT1uLlUsaT1uLkwsYT1uLlI7aWYoZT1pP2E/YXIoYSk6aTphLHU/dS5MPT09bj91Lkw9ZTp1LlI9ZTp0aGlzLl89ZSxpJiZhPyhyPWUuQyxlLkM9bi5DLGUuTD1pLGkuVT1lLGUhPT1hPyh1PWUuVSxlLlU9bi5VLG49ZS5SLHUuTD1uLGUuUj1hLGEuVT1lKTooZS5VPXUsdT1lLG49ZS5SKSk6KHI9bi5DLG49ZSksbiYmKG4uVT11KSwhcil7aWYobiYmbi5DKXJldHVybiB2b2lkKG4uQz0hMSk7ZG97aWYobj09PXRoaXMuXylicmVhaztpZihuPT09dS5MKXtpZih0PXUuUix0LkMmJih0LkM9ITEsdS5DPSEwLHVyKHRoaXMsdSksdD11LlIpLHQuTCYmdC5MLkN8fHQuUiYmdC5SLkMpe3QuUiYmdC5SLkN8fCh0LkwuQz0hMSx0LkM9ITAsaXIodGhpcyx0KSx0PXUuUiksdC5DPXUuQyx1LkM9dC5SLkM9ITEsdXIodGhpcyx1KSxuPXRoaXMuXzticmVha319ZWxzZSBpZih0PXUuTCx0LkMmJih0LkM9ITEsdS5DPSEwLGlyKHRoaXMsdSksdD11LkwpLHQuTCYmdC5MLkN8fHQuUiYmdC5SLkMpe3QuTCYmdC5MLkN8fCh0LlIuQz0hMSx0LkM9ITAsdXIodGhpcyx0KSx0PXUuTCksdC5DPXUuQyx1LkM9dC5MLkM9ITEsaXIodGhpcyx1KSxuPXRoaXMuXzticmVha310LkM9ITAsbj11LHU9dS5VfXdoaWxlKCFuLkMpO24mJihuLkM9ITEpfX19LG9hLmdlb20udm9yb25vaT1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KG4pe3ZhciB0PW5ldyBBcnJheShuLmxlbmd0aCkscj1vWzBdWzBdLHU9b1swXVsxXSxpPW9bMV1bMF0sYT1vWzFdWzFdO3JldHVybiBvcihlKG4pLG8pLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oZSxvKXt2YXIgbD1lLmVkZ2VzLGM9ZS5zaXRlLHM9dFtvXT1sLmxlbmd0aD9sLm1hcChmdW5jdGlvbihuKXt2YXIgdD1uLnN0YXJ0KCk7cmV0dXJuW3QueCx0LnldfSk6Yy54Pj1yJiZjLng8PWkmJmMueT49dSYmYy55PD1hP1tbcixhXSxbaSxhXSxbaSx1XSxbcix1XV06W107cy5wb2ludD1uW29dfSksdH1mdW5jdGlvbiBlKG4pe3JldHVybiBuLm1hcChmdW5jdGlvbihuLHQpe3JldHVybnt4Ok1hdGgucm91bmQoaShuLHQpL0RhKSpEYSx5Ok1hdGgucm91bmQoYShuLHQpL0RhKSpEYSxpOnR9fSl9dmFyIHI9Q2UsdT16ZSxpPXIsYT11LG89c2w7cmV0dXJuIG4/dChuKToodC5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gb3IoZShuKSkuZWRnZXMuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiBuLmwmJm4ucn0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOm5bdC5sLmldLHRhcmdldDpuW3Quci5pXX19KX0sdC50cmlhbmdsZXM9ZnVuY3Rpb24obil7dmFyIHQ9W107cmV0dXJuIG9yKGUobikpLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oZSxyKXtmb3IodmFyIHUsaSxhPWUuc2l0ZSxvPWUuZWRnZXMuc29ydChWZSksbD0tMSxjPW8ubGVuZ3RoLHM9b1tjLTFdLmVkZ2UsZj1zLmw9PT1hP3MucjpzLmw7KytsPGM7KXU9cyxpPWYscz1vW2xdLmVkZ2UsZj1zLmw9PT1hP3MucjpzLmwscjxpLmkmJnI8Zi5pJiZjcihhLGksZik8MCYmdC5wdXNoKFtuW3JdLG5baS5pXSxuW2YuaV1dKX0pLHR9LHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1FbihyPW4pLHQpOnJ9LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1Fbih1PW4pLHQpOnV9LHQuY2xpcEV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT1uP3NsOm4sdCk6bz09PXNsP251bGw6b30sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QuY2xpcEV4dGVudChuJiZbWzAsMF0sbl0pOm89PT1zbD9udWxsOm8mJm9bMV19LHQpfTt2YXIgc2w9W1stMWU2LC0xZTZdLFsxZTYsMWU2XV07b2EuZ2VvbS5kZWxhdW5heT1mdW5jdGlvbihuKXtyZXR1cm4gb2EuZ2VvbS52b3Jvbm9pKCkudHJpYW5nbGVzKG4pfSxvYS5nZW9tLnF1YWR0cmVlPWZ1bmN0aW9uKG4sdCxlLHIsdSl7ZnVuY3Rpb24gaShuKXtmdW5jdGlvbiBpKG4sdCxlLHIsdSxpLGEsbyl7aWYoIWlzTmFOKGUpJiYhaXNOYU4ocikpaWYobi5sZWFmKXt2YXIgbD1uLngscz1uLnk7aWYobnVsbCE9bClpZihNYShsLWUpK01hKHMtcik8LjAxKWMobix0LGUscix1LGksYSxvKTtlbHNle3ZhciBmPW4ucG9pbnQ7bi54PW4ueT1uLnBvaW50PW51bGwsYyhuLGYsbCxzLHUsaSxhLG8pLGMobix0LGUscix1LGksYSxvKX1lbHNlIG4ueD1lLG4ueT1yLG4ucG9pbnQ9dH1lbHNlIGMobix0LGUscix1LGksYSxvKX1mdW5jdGlvbiBjKG4sdCxlLHIsdSxhLG8sbCl7dmFyIGM9LjUqKHUrbykscz0uNSooYStsKSxmPWU+PWMsaD1yPj1zLGc9aDw8MXxmO24ubGVhZj0hMSxuPW4ubm9kZXNbZ118fChuLm5vZGVzW2ddPWhyKCkpLGY/dT1jOm89YyxoP2E9czpsPXMsaShuLHQsZSxyLHUsYSxvLGwpfXZhciBzLGYsaCxnLHAsdixkLG0seSxNPUVuKG8pLHg9RW4obCk7aWYobnVsbCE9dCl2PXQsZD1lLG09cix5PXU7ZWxzZSBpZihtPXk9LSh2PWQ9MS8wKSxmPVtdLGg9W10scD1uLmxlbmd0aCxhKWZvcihnPTA7cD5nOysrZylzPW5bZ10scy54PHYmJih2PXMueCkscy55PGQmJihkPXMueSkscy54Pm0mJihtPXMueCkscy55PnkmJih5PXMueSksZi5wdXNoKHMueCksaC5wdXNoKHMueSk7ZWxzZSBmb3IoZz0wO3A+ZzsrK2cpe3ZhciBiPStNKHM9bltnXSxnKSxfPSt4KHMsZyk7dj5iJiYodj1iKSxkPl8mJihkPV8pLGI+bSYmKG09YiksXz55JiYoeT1fKSxmLnB1c2goYiksaC5wdXNoKF8pfXZhciB3PW0tdixTPXktZDt3PlM/eT1kK3c6bT12K1M7dmFyIGs9aHIoKTtpZihrLmFkZD1mdW5jdGlvbihuKXtpKGssbiwrTShuLCsrZyksK3gobixnKSx2LGQsbSx5KX0say52aXNpdD1mdW5jdGlvbihuKXtncihuLGssdixkLG0seSl9LGsuZmluZD1mdW5jdGlvbihuKXtyZXR1cm4gcHIoayxuWzBdLG5bMV0sdixkLG0seSl9LGc9LTEsbnVsbD09dCl7Zm9yKDsrK2c8cDspaShrLG5bZ10sZltnXSxoW2ddLHYsZCxtLHkpOy0tZ31lbHNlIG4uZm9yRWFjaChrLmFkZCk7cmV0dXJuIGY9aD1uPXM9bnVsbCxrfXZhciBhLG89Q2UsbD16ZTtyZXR1cm4oYT1hcmd1bWVudHMubGVuZ3RoKT8obz1zcixsPWZyLDM9PT1hJiYodT1lLHI9dCxlPXQ9MCksaShuKSk6KGkueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLGkpOm99LGkueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1uLGkpOmx9LGkuZXh0ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP3Q9ZT1yPXU9bnVsbDoodD0rblswXVswXSxlPStuWzBdWzFdLHI9K25bMV1bMF0sdT0rblsxXVsxXSksaSk6bnVsbD09dD9udWxsOltbdCxlXSxbcix1XV19LGkuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj90PWU9cj11PW51bGw6KHQ9ZT0wLHI9K25bMF0sdT0rblsxXSksaSk6bnVsbD09dD9udWxsOltyLXQsdS1lXX0saSl9LG9hLmludGVycG9sYXRlUmdiPXZyLG9hLmludGVycG9sYXRlT2JqZWN0PWRyLG9hLmludGVycG9sYXRlTnVtYmVyPW1yLG9hLmludGVycG9sYXRlU3RyaW5nPXlyO3ZhciBmbD0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csaGw9bmV3IFJlZ0V4cChmbC5zb3VyY2UsImciKTtvYS5pbnRlcnBvbGF0ZT1NcixvYS5pbnRlcnBvbGF0b3JzPVtmdW5jdGlvbihuLHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybigic3RyaW5nIj09PWU/cm8uaGFzKHQudG9Mb3dlckNhc2UoKSl8fC9eKCN8cmdiXCh8aHNsXCgpL2kudGVzdCh0KT92cjp5cjp0IGluc3RhbmNlb2Ygb24/dnI6QXJyYXkuaXNBcnJheSh0KT94cjoib2JqZWN0Ij09PWUmJmlzTmFOKHQpP2RyOm1yKShuLHQpfV0sb2EuaW50ZXJwb2xhdGVBcnJheT14cjt2YXIgZ2w9ZnVuY3Rpb24oKXtyZXR1cm4geX0scGw9b2EubWFwKHtsaW5lYXI6Z2wscG9seTpFcixxdWFkOmZ1bmN0aW9uKCl7cmV0dXJuIFNyfSxjdWJpYzpmdW5jdGlvbigpe3JldHVybiBrcn0sc2luOmZ1bmN0aW9uKCl7cmV0dXJuIEFyfSxleHA6ZnVuY3Rpb24oKXtyZXR1cm4gQ3J9LGNpcmNsZTpmdW5jdGlvbigpe3JldHVybiB6cn0sZWxhc3RpYzpMcixiYWNrOnFyLGJvdW5jZTpmdW5jdGlvbigpe3JldHVybiBUcn19KSx2bD1vYS5tYXAoeyJpbiI6eSxvdXQ6X3IsImluLW91dCI6d3IsIm91dC1pbiI6ZnVuY3Rpb24obil7cmV0dXJuIHdyKF9yKG4pKX19KTtvYS5lYXNlPWZ1bmN0aW9uKG4pe3ZhciB0PW4uaW5kZXhPZigiLSIpLGU9dD49MD9uLnNsaWNlKDAsdCk6bixyPXQ+PTA/bi5zbGljZSh0KzEpOiJpbiI7cmV0dXJuIGU9cGwuZ2V0KGUpfHxnbCxyPXZsLmdldChyKXx8eSxicihyKGUuYXBwbHkobnVsbCxsYS5jYWxsKGFyZ3VtZW50cywxKSkpKX0sb2EuaW50ZXJwb2xhdGVIY2w9UnIsb2EuaW50ZXJwb2xhdGVIc2w9RHIsb2EuaW50ZXJwb2xhdGVMYWI9UHIsb2EuaW50ZXJwb2xhdGVSb3VuZD1VcixvYS50cmFuc2Zvcm09ZnVuY3Rpb24obil7dmFyIHQ9c2EuY3JlYXRlRWxlbWVudE5TKG9hLm5zLnByZWZpeC5zdmcsImciKTtyZXR1cm4ob2EudHJhbnNmb3JtPWZ1bmN0aW9uKG4pe2lmKG51bGwhPW4pe3Quc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLG4pO3ZhciBlPXQudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKX1yZXR1cm4gbmV3IGpyKGU/ZS5tYXRyaXg6ZGwpfSkobil9LGpyLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJ0cmFuc2xhdGUoIit0aGlzLnRyYW5zbGF0ZSsiKXJvdGF0ZSgiK3RoaXMucm90YXRlKyIpc2tld1goIit0aGlzLnNrZXcrIilzY2FsZSgiK3RoaXMuc2NhbGUrIikifTt2YXIgZGw9e2E6MSxiOjAsYzowLGQ6MSxlOjAsZjowfTtvYS5pbnRlcnBvbGF0ZVRyYW5zZm9ybT0kcixvYS5sYXlvdXQ9e30sb2EubGF5b3V0LmJ1bmRsZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihuKXtmb3IodmFyIHQ9W10sZT0tMSxyPW4ubGVuZ3RoOysrZTxyOyl0LnB1c2goSnIobltlXSkpO3JldHVybiB0fX0sb2EubGF5b3V0LmNob3JkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3ZhciBuLGMsZixoLGcscD17fSx2PVtdLGQ9b2EucmFuZ2UoaSksbT1bXTtmb3IoZT1bXSxyPVtdLG49MCxoPS0xOysraDxpOyl7Zm9yKGM9MCxnPS0xOysrZzxpOyljKz11W2hdW2ddO3YucHVzaChjKSxtLnB1c2gob2EucmFuZ2UoaSkpLG4rPWN9Zm9yKGEmJmQuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiBhKHZbbl0sdlt0XSl9KSxvJiZtLmZvckVhY2goZnVuY3Rpb24obix0KXtuLnNvcnQoZnVuY3Rpb24obixlKXtyZXR1cm4gbyh1W3RdW25dLHVbdF1bZV0pfSl9KSxuPShqYS1zKmkpL24sYz0wLGg9LTE7KytoPGk7KXtmb3IoZj1jLGc9LTE7KytnPGk7KXt2YXIgeT1kW2hdLE09bVt5XVtnXSx4PXVbeV1bTV0sYj1jLF89Yys9eCpuO3BbeSsiLSIrTV09e2luZGV4Onksc3ViaW5kZXg6TSxzdGFydEFuZ2xlOmIsZW5kQW5nbGU6Xyx2YWx1ZTp4fX1yW3ldPXtpbmRleDp5LHN0YXJ0QW5nbGU6ZixlbmRBbmdsZTpjLHZhbHVlOnZbeV19LGMrPXN9Zm9yKGg9LTE7KytoPGk7KWZvcihnPWgtMTsrK2c8aTspe3ZhciB3PXBbaCsiLSIrZ10sUz1wW2crIi0iK2hdOyh3LnZhbHVlfHxTLnZhbHVlKSYmZS5wdXNoKHcudmFsdWU8Uy52YWx1ZT97c291cmNlOlMsdGFyZ2V0Ond9Ontzb3VyY2U6dyx0YXJnZXQ6U30pfWwmJnQoKX1mdW5jdGlvbiB0KCl7ZS5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIGwoKG4uc291cmNlLnZhbHVlK24udGFyZ2V0LnZhbHVlKS8yLCh0LnNvdXJjZS52YWx1ZSt0LnRhcmdldC52YWx1ZSkvMil9KX12YXIgZSxyLHUsaSxhLG8sbCxjPXt9LHM9MDtyZXR1cm4gYy5tYXRyaXg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9KHU9bikmJnUubGVuZ3RoLGU9cj1udWxsLGMpOnV9LGMucGFkZGluZz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1uLGU9cj1udWxsLGMpOnN9LGMuc29ydEdyb3Vwcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1uLGU9cj1udWxsLGMpOmF9LGMuc29ydFN1Ymdyb3Vwcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLGU9bnVsbCxjKTpvfSxjLnNvcnRDaG9yZHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bixlJiZ0KCksYyk6bH0sYy5jaG9yZHM9ZnVuY3Rpb24oKXtyZXR1cm4gZXx8bigpLGV9LGMuZ3JvdXBzPWZ1bmN0aW9uKCl7cmV0dXJuIHJ8fG4oKSxyfSxjfSxvYS5sYXlvdXQuZm9yY2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe3JldHVybiBmdW5jdGlvbih0LGUscix1KXtpZih0LnBvaW50IT09bil7dmFyIGk9dC5jeC1uLngsYT10LmN5LW4ueSxvPXUtZSxsPWkqaSthKmE7aWYobD5vKm8vbSl7aWYodj5sKXt2YXIgYz10LmNoYXJnZS9sO24ucHgtPWkqYyxuLnB5LT1hKmN9cmV0dXJuITB9aWYodC5wb2ludCYmbCYmdj5sKXt2YXIgYz10LnBvaW50Q2hhcmdlL2w7bi5weC09aSpjLG4ucHktPWEqY319cmV0dXJuIXQuY2hhcmdlfX1mdW5jdGlvbiB0KG4pe24ucHg9b2EuZXZlbnQueCxuLnB5PW9hLmV2ZW50LnksbC5yZXN1bWUoKX12YXIgZSxyLHUsaSxhLG8sbD17fSxjPW9hLmRpc3BhdGNoKCJzdGFydCIsInRpY2siLCJlbmQiKSxzPVsxLDFdLGY9LjksaD1tbCxnPXlsLHA9LTMwLHY9TWwsZD0uMSxtPS42NCxNPVtdLHg9W107cmV0dXJuIGwudGljaz1mdW5jdGlvbigpe2lmKCh1Kj0uOTkpPC4wMDUpcmV0dXJuIGU9bnVsbCxjLmVuZCh7dHlwZToiZW5kIixhbHBoYTp1PTB9KSwhMDt2YXIgdCxyLGwsaCxnLHYsbSx5LGIsXz1NLmxlbmd0aCx3PXgubGVuZ3RoO2ZvcihyPTA7dz5yOysrcilsPXhbcl0saD1sLnNvdXJjZSxnPWwudGFyZ2V0LHk9Zy54LWgueCxiPWcueS1oLnksKHY9eSp5K2IqYikmJih2PXUqYVtyXSooKHY9TWF0aC5zcXJ0KHYpKS1pW3JdKS92LHkqPXYsYio9dixnLngtPXkqKG09aC53ZWlnaHQrZy53ZWlnaHQ/aC53ZWlnaHQvKGgud2VpZ2h0K2cud2VpZ2h0KTouNSksZy55LT1iKm0saC54Kz15KihtPTEtbSksaC55Kz1iKm0pO2lmKChtPXUqZCkmJih5PXNbMF0vMixiPXNbMV0vMixyPS0xLG0pKWZvcig7KytyPF87KWw9TVtyXSxsLngrPSh5LWwueCkqbSxsLnkrPShiLWwueSkqbTtpZihwKWZvcihydSh0PW9hLmdlb20ucXVhZHRyZWUoTSksdSxvKSxyPS0xOysrcjxfOykobD1NW3JdKS5maXhlZHx8dC52aXNpdChuKGwpKTtmb3Iocj0tMTsrK3I8XzspbD1NW3JdLGwuZml4ZWQ/KGwueD1sLnB4LGwueT1sLnB5KToobC54LT0obC5weC0obC5weD1sLngpKSpmLGwueS09KGwucHktKGwucHk9bC55KSkqZik7Yy50aWNrKHt0eXBlOiJ0aWNrIixhbHBoYTp1fSl9LGwubm9kZXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09bixsKTpNfSxsLmxpbmtzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PW4sbCk6eH0sbC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPW4sbCk6c30sbC5saW5rRGlzdGFuY2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjorbixsKTpofSxsLmRpc3RhbmNlPWwubGlua0Rpc3RhbmNlLGwubGlua1N0cmVuZ3RoPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246K24sbCk6Z30sbC5mcmljdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0rbixsKTpmfSxsLmNoYXJnZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOituLGwpOnB9LGwuY2hhcmdlRGlzdGFuY2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9bipuLGwpOk1hdGguc3FydCh2KX0sbC5ncmF2aXR5PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPStuLGwpOmR9LGwudGhldGE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09bipuLGwpOk1hdGguc3FydChtKX0sbC5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rbix1P24+MD91PW46KGUuYz1udWxsLGUudD1OYU4sZT1udWxsLGMuZW5kKHt0eXBlOiJlbmQiLGFscGhhOnU9MH0pKTpuPjAmJihjLnN0YXJ0KHt0eXBlOiJzdGFydCIsYWxwaGE6dT1ufSksZT1xbihsLnRpY2spKSxsKTp1fSxsLnN0YXJ0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHIpe2lmKCFlKXtmb3IoZT1uZXcgQXJyYXkodSksbD0wO3U+bDsrK2wpZVtsXT1bXTtmb3IobD0wO2M+bDsrK2wpe3ZhciBpPXhbbF07ZVtpLnNvdXJjZS5pbmRleF0ucHVzaChpLnRhcmdldCksZVtpLnRhcmdldC5pbmRleF0ucHVzaChpLnNvdXJjZSl9fWZvcih2YXIgYSxvPWVbdF0sbD0tMSxzPW8ubGVuZ3RoOysrbDxzOylpZighaXNOYU4oYT1vW2xdW25dKSlyZXR1cm4gYTtyZXR1cm4gTWF0aC5yYW5kb20oKSpyfXZhciB0LGUscix1PU0ubGVuZ3RoLGM9eC5sZW5ndGgsZj1zWzBdLHY9c1sxXTtmb3IodD0wO3U+dDsrK3QpKHI9TVt0XSkuaW5kZXg9dCxyLndlaWdodD0wO2Zvcih0PTA7Yz50OysrdClyPXhbdF0sIm51bWJlciI9PXR5cGVvZiByLnNvdXJjZSYmKHIuc291cmNlPU1bci5zb3VyY2VdKSwibnVtYmVyIj09dHlwZW9mIHIudGFyZ2V0JiYoci50YXJnZXQ9TVtyLnRhcmdldF0pLCsrci5zb3VyY2Uud2VpZ2h0LCsrci50YXJnZXQud2VpZ2h0O2Zvcih0PTA7dT50OysrdClyPU1bdF0saXNOYU4oci54KSYmKHIueD1uKCJ4IixmKSksaXNOYU4oci55KSYmKHIueT1uKCJ5Iix2KSksaXNOYU4oci5weCkmJihyLnB4PXIueCksaXNOYU4oci5weSkmJihyLnB5PXIueSk7aWYoaT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgaClmb3IodD0wO2M+dDsrK3QpaVt0XT0raC5jYWxsKHRoaXMseFt0XSx0KTtlbHNlIGZvcih0PTA7Yz50OysrdClpW3RdPWg7aWYoYT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZylmb3IodD0wO2M+dDsrK3QpYVt0XT0rZy5jYWxsKHRoaXMseFt0XSx0KTtlbHNlIGZvcih0PTA7Yz50OysrdClhW3RdPWc7aWYobz1bXSwiZnVuY3Rpb24iPT10eXBlb2YgcClmb3IodD0wO3U+dDsrK3Qpb1t0XT0rcC5jYWxsKHRoaXMsTVt0XSx0KTtlbHNlIGZvcih0PTA7dT50OysrdClvW3RdPXA7cmV0dXJuIGwucmVzdW1lKCl9LGwucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGwuYWxwaGEoLjEpfSxsLnN0b3A9ZnVuY3Rpb24oKXtyZXR1cm4gbC5hbHBoYSgwKX0sbC5kcmFnPWZ1bmN0aW9uKCl7cmV0dXJuIHJ8fChyPW9hLmJlaGF2aW9yLmRyYWcoKS5vcmlnaW4oeSkub24oImRyYWdzdGFydC5mb3JjZSIsUXIpLm9uKCJkcmFnLmZvcmNlIix0KS5vbigiZHJhZ2VuZC5mb3JjZSIsbnUpKSxhcmd1bWVudHMubGVuZ3RoP3ZvaWQgdGhpcy5vbigibW91c2VvdmVyLmZvcmNlIix0dSkub24oIm1vdXNlb3V0LmZvcmNlIixldSkuY2FsbChyKTpyfSxvYS5yZWJpbmQobCxjLCJvbiIpfTt2YXIgbWw9MjAseWw9MSxNbD0xLzA7b2EubGF5b3V0LmhpZXJhcmNoeT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odSl7dmFyIGksYT1bdV0sbz1bXTtmb3IodS5kZXB0aD0wO251bGwhPShpPWEucG9wKCkpOylpZihvLnB1c2goaSksKGM9ZS5jYWxsKG4saSxpLmRlcHRoKSkmJihsPWMubGVuZ3RoKSl7Zm9yKHZhciBsLGMsczstLWw+PTA7KWEucHVzaChzPWNbbF0pLHMucGFyZW50PWkscy5kZXB0aD1pLmRlcHRoKzE7ciYmKGkudmFsdWU9MCksaS5jaGlsZHJlbj1jfWVsc2UgciYmKGkudmFsdWU9K3IuY2FsbChuLGksaS5kZXB0aCl8fDApLGRlbGV0ZSBpLmNoaWxkcmVuO3JldHVybiBhdSh1LGZ1bmN0aW9uKG4pe3ZhciBlLHU7dCYmKGU9bi5jaGlsZHJlbikmJmUuc29ydCh0KSxyJiYodT1uLnBhcmVudCkmJih1LnZhbHVlKz1uLnZhbHVlKX0pLG99dmFyIHQ9Y3UsZT1vdSxyPWx1O3JldHVybiBuLnNvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLmNoaWxkcmVuPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4ucmV2YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gciYmKGl1KHQsZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmKG4udmFsdWU9MCl9KSxhdSh0LGZ1bmN0aW9uKHQpe3ZhciBlO3QuY2hpbGRyZW58fCh0LnZhbHVlPStyLmNhbGwobix0LHQuZGVwdGgpfHwwKSwoZT10LnBhcmVudCkmJihlLnZhbHVlKz10LnZhbHVlKX0pKSx0fSxufSxvYS5sYXlvdXQucGFydGl0aW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0LGUscix1KXt2YXIgaT10LmNoaWxkcmVuO2lmKHQueD1lLHQueT10LmRlcHRoKnUsdC5keD1yLHQuZHk9dSxpJiYoYT1pLmxlbmd0aCkpe3ZhciBhLG8sbCxjPS0xO2ZvcihyPXQudmFsdWU/ci90LnZhbHVlOjA7KytjPGE7KW4obz1pW2NdLGUsbD1vLnZhbHVlKnIsdSksZSs9bH19ZnVuY3Rpb24gdChuKXt2YXIgZT1uLmNoaWxkcmVuLHI9MDtpZihlJiYodT1lLmxlbmd0aCkpZm9yKHZhciB1LGk9LTE7KytpPHU7KXI9TWF0aC5tYXgocix0KGVbaV0pKTtyZXR1cm4gMStyfWZ1bmN0aW9uIGUoZSxpKXt2YXIgYT1yLmNhbGwodGhpcyxlLGkpO3JldHVybiBuKGFbMF0sMCx1WzBdLHVbMV0vdChhWzBdKSksYX12YXIgcj1vYS5sYXlvdXQuaGllcmFyY2h5KCksdT1bMSwxXTtyZXR1cm4gZS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sZSk6dX0sdXUoZSxyKX0sb2EubGF5b3V0LnBpZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oYSl7dmFyIG8sbD1hLmxlbmd0aCxjPWEubWFwKGZ1bmN0aW9uKGUscil7cmV0dXJuK3QuY2FsbChuLGUscil9KSxzPSsoImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ciksZj0oImZ1bmN0aW9uIj09dHlwZW9mIHU/dS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dSktcyxoPU1hdGgubWluKE1hdGguYWJzKGYpL2wsKygiZnVuY3Rpb24iPT10eXBlb2YgaT9pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTppKSksZz1oKigwPmY/LTE6MSkscD1vYS5zdW0oYyksdj1wPyhmLWwqZykvcDowLGQ9b2EucmFuZ2UobCksbT1bXTtyZXR1cm4gbnVsbCE9ZSYmZC5zb3J0KGU9PT14bD9mdW5jdGlvbihuLHQpe3JldHVybiBjW3RdLWNbbl19OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIGUoYVtuXSxhW3RdKX0pLGQuZm9yRWFjaChmdW5jdGlvbihuKXttW25dPXtkYXRhOmFbbl0sdmFsdWU6bz1jW25dLHN0YXJ0QW5nbGU6cyxlbmRBbmdsZTpzKz1vKnYrZyxwYWRBbmdsZTpofX0pLG19dmFyIHQ9TnVtYmVyLGU9eGwscj0wLHU9amEsaT0wO3JldHVybiBuLnZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi5zb3J0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbi5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG4ucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxuKTppfSxufTt2YXIgeGw9e307b2EubGF5b3V0LnN0YWNrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihvLGwpe2lmKCEoaD1vLmxlbmd0aCkpcmV0dXJuIG87dmFyIGM9by5tYXAoZnVuY3Rpb24oZSxyKXtyZXR1cm4gdC5jYWxsKG4sZSxyKX0pLHM9Yy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGZ1bmN0aW9uKHQsZSl7cmV0dXJuW2kuY2FsbChuLHQsZSksYS5jYWxsKG4sdCxlKV19KX0pLGY9ZS5jYWxsKG4scyxsKTtjPW9hLnBlcm11dGUoYyxmKSxzPW9hLnBlcm11dGUocyxmKTt2YXIgaCxnLHAsdixkPXIuY2FsbChuLHMsbCksbT1jWzBdLmxlbmd0aDtmb3IocD0wO20+cDsrK3ApZm9yKHUuY2FsbChuLGNbMF1bcF0sdj1kW3BdLHNbMF1bcF1bMV0pLGc9MTtoPmc7KytnKXUuY2FsbChuLGNbZ11bcF0sdis9c1tnLTFdW3BdWzFdLHNbZ11bcF1bMV0pO3JldHVybiBvfXZhciB0PXksZT1wdSxyPXZ1LHU9Z3UsaT1mdSxhPWh1O3JldHVybiBuLnZhbHVlcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4ub3JkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpibC5nZXQodCl8fHB1LG4pOmV9LG4ub2Zmc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6X2wuZ2V0KHQpfHx2dSxuKTpyfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxuKTppfSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxuKTphfSxuLm91dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG59O3ZhciBibD1vYS5tYXAoeyJpbnNpZGUtb3V0IjpmdW5jdGlvbihuKXt2YXIgdCxlLHI9bi5sZW5ndGgsdT1uLm1hcChkdSksaT1uLm1hcChtdSksYT1vYS5yYW5nZShyKS5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHVbbl0tdVt0XX0pLG89MCxsPTAsYz1bXSxzPVtdO2Zvcih0PTA7cj50OysrdCllPWFbdF0sbD5vPyhvKz1pW2VdLGMucHVzaChlKSk6KGwrPWlbZV0scy5wdXNoKGUpKTtyZXR1cm4gcy5yZXZlcnNlKCkuY29uY2F0KGMpfSxyZXZlcnNlOmZ1bmN0aW9uKG4pe3JldHVybiBvYS5yYW5nZShuLmxlbmd0aCkucmV2ZXJzZSgpfSwiZGVmYXVsdCI6cHV9KSxfbD1vYS5tYXAoe3NpbGhvdWV0dGU6ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9bi5sZW5ndGgsaT1uWzBdLmxlbmd0aCxhPVtdLG89MCxsPVtdO2ZvcihlPTA7aT5lOysrZSl7Zm9yKHQ9MCxyPTA7dT50O3QrKylyKz1uW3RdW2VdWzFdO3I+byYmKG89ciksYS5wdXNoKHIpfWZvcihlPTA7aT5lOysrZSlsW2VdPShvLWFbZV0pLzI7cmV0dXJuIGx9LHdpZ2dsZTpmdW5jdGlvbihuKXt2YXIgdCxlLHIsdSxpLGEsbyxsLGMscz1uLmxlbmd0aCxmPW5bMF0saD1mLmxlbmd0aCxnPVtdO2ZvcihnWzBdPWw9Yz0wLGU9MTtoPmU7KytlKXtmb3IodD0wLHU9MDtzPnQ7Kyt0KXUrPW5bdF1bZV1bMV07Zm9yKHQ9MCxpPTAsbz1mW2VdWzBdLWZbZS0xXVswXTtzPnQ7Kyt0KXtmb3Iocj0wLGE9KG5bdF1bZV1bMV0tblt0XVtlLTFdWzFdKS8oMipvKTt0PnI7KytyKWErPShuW3JdW2VdWzFdLW5bcl1bZS0xXVsxXSkvbztpKz1hKm5bdF1bZV1bMV19Z1tlXT1sLT11P2kvdSpvOjAsYz5sJiYoYz1sKX1mb3IoZT0wO2g+ZTsrK2UpZ1tlXS09YztyZXR1cm4gZ30sZXhwYW5kOmZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PW4ubGVuZ3RoLGk9blswXS5sZW5ndGgsYT0xL3Usbz1bXTtmb3IoZT0wO2k+ZTsrK2Upe2Zvcih0PTAscj0wO3U+dDt0Kyspcis9blt0XVtlXVsxXTtpZihyKWZvcih0PTA7dT50O3QrKyluW3RdW2VdWzFdLz1yO2Vsc2UgZm9yKHQ9MDt1PnQ7dCsrKW5bdF1bZV1bMV09YX1mb3IoZT0wO2k+ZTsrK2Upb1tlXT0wO3JldHVybiBvfSx6ZXJvOnZ1fSk7b2EubGF5b3V0Lmhpc3RvZ3JhbT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixpKXtmb3IodmFyIGEsbyxsPVtdLGM9bi5tYXAoZSx0aGlzKSxzPXIuY2FsbCh0aGlzLGMsaSksZj11LmNhbGwodGhpcyxzLGMsaSksaT0tMSxoPWMubGVuZ3RoLGc9Zi5sZW5ndGgtMSxwPXQ/MToxL2g7KytpPGc7KWE9bFtpXT1bXSxhLmR4PWZbaSsxXS0oYS54PWZbaV0pLGEueT0wO2lmKGc+MClmb3IoaT0tMTsrK2k8aDspbz1jW2ldLG8+PXNbMF0mJm88PXNbMV0mJihhPWxbb2EuYmlzZWN0KGYsbywxLGcpLTFdLGEueSs9cCxhLnB1c2gobltpXSkpO3JldHVybiBsfXZhciB0PSEwLGU9TnVtYmVyLHI9YnUsdT1NdTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9RW4odCksbik6cn0sbi5iaW5zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbihuKXtyZXR1cm4geHUobix0KX06RW4odCksbik6dX0sbi5mcmVxdWVuY3k9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ISFlLG4pOnR9LG59LG9hLmxheW91dC5wYWNrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGkpe3ZhciBhPWUuY2FsbCh0aGlzLG4saSksbz1hWzBdLGw9dVswXSxjPXVbMV0scz1udWxsPT10P01hdGguc3FydDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O2lmKG8ueD1vLnk9MCxhdShvLGZ1bmN0aW9uKG4pe24ucj0rcyhuLnZhbHVlKX0pLGF1KG8sTnUpLHIpe3ZhciBmPXIqKHQ/MTpNYXRoLm1heCgyKm8uci9sLDIqby5yL2MpKS8yO2F1KG8sZnVuY3Rpb24obil7bi5yKz1mfSksYXUobyxOdSksYXUobyxmdW5jdGlvbihuKXtuLnItPWZ9KX1yZXR1cm4gQ3UobyxsLzIsYy8yLHQ/MToxL01hdGgubWF4KDIqby5yL2wsMipvLnIvYykpLGF9dmFyIHQsZT1vYS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChfdSkscj0wLHU9WzEsMV07cmV0dXJuIG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG4ucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PWV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6K2Usbik6dH0sbi5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LG4pOnJ9LHV1KG4sZSl9LG9hLmxheW91dC50cmVlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBzPWEuY2FsbCh0aGlzLG4sdSksZj1zWzBdLGg9dChmKTtpZihhdShoLGUpLGgucGFyZW50Lm09LWgueixpdShoLHIpLGMpaXUoZixpKTtlbHNle3ZhciBnPWYscD1mLHY9ZjtpdShmLGZ1bmN0aW9uKG4pe24ueDxnLngmJihnPW4pLG4ueD5wLngmJihwPW4pLG4uZGVwdGg+di5kZXB0aCYmKHY9bil9KTt2YXIgZD1vKGcscCkvMi1nLngsbT1sWzBdLyhwLngrbyhwLGcpLzIrZCkseT1sWzFdLyh2LmRlcHRofHwxKTtpdShmLGZ1bmN0aW9uKG4pe24ueD0obi54K2QpKm0sbi55PW4uZGVwdGgqeX0pfXJldHVybiBzfWZ1bmN0aW9uIHQobil7Zm9yKHZhciB0LGU9e0E6bnVsbCxjaGlsZHJlbjpbbl19LHI9W2VdO251bGwhPSh0PXIucG9wKCkpOylmb3IodmFyIHUsaT10LmNoaWxkcmVuLGE9MCxvPWkubGVuZ3RoO28+YTsrK2Epci5wdXNoKChpW2FdPXU9e186aVthXSxwYXJlbnQ6dCxjaGlsZHJlbjoodT1pW2FdLmNoaWxkcmVuKSYmdS5zbGljZSgpfHxbXSxBOm51bGwsYTpudWxsLHo6MCxtOjAsYzowLHM6MCx0Om51bGwsaTphfSkuYT11KTtyZXR1cm4gZS5jaGlsZHJlblswXX1mdW5jdGlvbiBlKG4pe3ZhciB0PW4uY2hpbGRyZW4sZT1uLnBhcmVudC5jaGlsZHJlbixyPW4uaT9lW24uaS0xXTpudWxsO2lmKHQubGVuZ3RoKXtEdShuKTt2YXIgaT0odFswXS56K3RbdC5sZW5ndGgtMV0ueikvMjtyPyhuLno9ci56K28obi5fLHIuXyksbi5tPW4uei1pKTpuLno9aX1lbHNlIHImJihuLno9ci56K28obi5fLHIuXykpO24ucGFyZW50LkE9dShuLHIsbi5wYXJlbnQuQXx8ZVswXSl9ZnVuY3Rpb24gcihuKXtuLl8ueD1uLnorbi5wYXJlbnQubSxuLm0rPW4ucGFyZW50Lm19ZnVuY3Rpb24gdShuLHQsZSl7aWYodCl7Zm9yKHZhciByLHU9bixpPW4sYT10LGw9dS5wYXJlbnQuY2hpbGRyZW5bMF0sYz11Lm0scz1pLm0sZj1hLm0saD1sLm07YT1UdShhKSx1PXF1KHUpLGEmJnU7KWw9cXUobCksaT1UdShpKSxpLmE9bixyPWEueitmLXUuei1jK28oYS5fLHUuXykscj4wJiYoUnUoUHUoYSxuLGUpLG4sciksYys9cixzKz1yKSxmKz1hLm0sYys9dS5tLGgrPWwubSxzKz1pLm07YSYmIVR1KGkpJiYoaS50PWEsaS5tKz1mLXMpLHUmJiFxdShsKSYmKGwudD11LGwubSs9Yy1oLGU9bil9cmV0dXJuIGV9ZnVuY3Rpb24gaShuKXtuLngqPWxbMF0sbi55PW4uZGVwdGgqbFsxXX12YXIgYT1vYS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxvPUx1LGw9WzEsMV0sYz1udWxsO3JldHVybiBuLnNlcGFyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCxuKTpvfSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9bnVsbD09KGw9dCk/aTpudWxsLG4pOmM/bnVsbDpsfSxuLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW51bGw9PShsPXQpP251bGw6aSxuKTpjP2w6bnVsbH0sdXUobixhKX0sb2EubGF5b3V0LmNsdXN0ZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4saSl7dmFyIGEsbz10LmNhbGwodGhpcyxuLGkpLGw9b1swXSxjPTA7YXUobCxmdW5jdGlvbihuKXt2YXIgdD1uLmNoaWxkcmVuO3QmJnQubGVuZ3RoPyhuLng9anUodCksbi55PVV1KHQpKToobi54PWE/Yys9ZShuLGEpOjAsbi55PTAsYT1uKX0pO3ZhciBzPUZ1KGwpLGY9SHUobCksaD1zLngtZShzLGYpLzIsZz1mLngrZShmLHMpLzI7cmV0dXJuIGF1KGwsdT9mdW5jdGlvbihuKXtuLng9KG4ueC1sLngpKnJbMF0sbi55PShsLnktbi55KSpyWzFdfTpmdW5jdGlvbihuKXtuLng9KG4ueC1oKS8oZy1oKSpyWzBdLG4ueT0oMS0obC55P24ueS9sLnk6MSkpKnJbMV19KSxvfXZhciB0PW9hLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLGU9THUscj1bMSwxXSx1PSExO3JldHVybiBuLnNlcGFyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbD09KHI9dCksbik6dT9udWxsOnJ9LG4ubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbCE9KHI9dCksbik6dT9yOm51bGx9LHV1KG4sdCl9LG9hLmxheW91dC50cmVlbWFwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe2Zvcih2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDsrK3U8aTspcj0oZT1uW3VdKS52YWx1ZSooMD50PzA6dCksZS5hcmVhPWlzTmFOKHIpfHwwPj1yPzA6cn1mdW5jdGlvbiB0KGUpe3ZhciBpPWUuY2hpbGRyZW47aWYoaSYmaS5sZW5ndGgpe3ZhciBhLG8sbCxjPWYoZSkscz1bXSxoPWkuc2xpY2UoKSxwPTEvMCx2PSJzbGljZSI9PT1nP2MuZHg6ImRpY2UiPT09Zz9jLmR5OiJzbGljZS1kaWNlIj09PWc/MSZlLmRlcHRoP2MuZHk6Yy5keDpNYXRoLm1pbihjLmR4LGMuZHkpO2ZvcihuKGgsYy5keCpjLmR5L2UudmFsdWUpLHMuYXJlYT0wOyhsPWgubGVuZ3RoKT4wOylzLnB1c2goYT1oW2wtMV0pLHMuYXJlYSs9YS5hcmVhLCJzcXVhcmlmeSIhPT1nfHwobz1yKHMsdikpPD1wPyhoLnBvcCgpLHA9byk6KHMuYXJlYS09cy5wb3AoKS5hcmVhLHUocyx2LGMsITEpLHY9TWF0aC5taW4oYy5keCxjLmR5KSxzLmxlbmd0aD1zLmFyZWE9MCxwPTEvMCk7cy5sZW5ndGgmJih1KHMsdixjLCEwKSxzLmxlbmd0aD1zLmFyZWE9MCksaS5mb3JFYWNoKHQpfX1mdW5jdGlvbiBlKHQpe3ZhciByPXQuY2hpbGRyZW47aWYociYmci5sZW5ndGgpe3ZhciBpLGE9Zih0KSxvPXIuc2xpY2UoKSxsPVtdO2ZvcihuKG8sYS5keCphLmR5L3QudmFsdWUpLGwuYXJlYT0wO2k9by5wb3AoKTspbC5wdXNoKGkpLGwuYXJlYSs9aS5hcmVhLG51bGwhPWkueiYmKHUobCxpLno/YS5keDphLmR5LGEsIW8ubGVuZ3RoKSxsLmxlbmd0aD1sLmFyZWE9MCk7ci5mb3JFYWNoKGUpfX1mdW5jdGlvbiByKG4sdCl7Zm9yKHZhciBlLHI9bi5hcmVhLHU9MCxpPTEvMCxhPS0xLG89bi5sZW5ndGg7KythPG87KShlPW5bYV0uYXJlYSkmJihpPmUmJihpPWUpLGU+dSYmKHU9ZSkpO3JldHVybiByKj1yLHQqPXQscj9NYXRoLm1heCh0KnUqcC9yLHIvKHQqaSpwKSk6MS8wfWZ1bmN0aW9uIHUobix0LGUscil7dmFyIHUsaT0tMSxhPW4ubGVuZ3RoLG89ZS54LGM9ZS55LHM9dD9sKG4uYXJlYS90KTowOwppZih0PT1lLmR4KXtmb3IoKHJ8fHM+ZS5keSkmJihzPWUuZHkpOysraTxhOyl1PW5baV0sdS54PW8sdS55PWMsdS5keT1zLG8rPXUuZHg9TWF0aC5taW4oZS54K2UuZHgtbyxzP2wodS5hcmVhL3MpOjApO3Uuej0hMCx1LmR4Kz1lLngrZS5keC1vLGUueSs9cyxlLmR5LT1zfWVsc2V7Zm9yKChyfHxzPmUuZHgpJiYocz1lLmR4KTsrK2k8YTspdT1uW2ldLHUueD1vLHUueT1jLHUuZHg9cyxjKz11LmR5PU1hdGgubWluKGUueStlLmR5LWMscz9sKHUuYXJlYS9zKTowKTt1Lno9ITEsdS5keSs9ZS55K2UuZHktYyxlLngrPXMsZS5keC09c319ZnVuY3Rpb24gaShyKXt2YXIgdT1hfHxvKHIpLGk9dVswXTtyZXR1cm4gaS54PWkueT0wLGkudmFsdWU/KGkuZHg9Y1swXSxpLmR5PWNbMV0pOmkuZHg9aS5keT0wLGEmJm8ucmV2YWx1ZShpKSxuKFtpXSxpLmR4KmkuZHkvaS52YWx1ZSksKGE/ZTp0KShpKSxoJiYoYT11KSx1fXZhciBhLG89b2EubGF5b3V0LmhpZXJhcmNoeSgpLGw9TWF0aC5yb3VuZCxjPVsxLDFdLHM9bnVsbCxmPU91LGg9ITEsZz0ic3F1YXJpZnkiLHA9LjUqKDErTWF0aC5zcXJ0KDUpKTtyZXR1cm4gaS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4saSk6Y30saS5wYWRkaW5nPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQodCl7dmFyIGU9bi5jYWxsKGksdCx0LmRlcHRoKTtyZXR1cm4gbnVsbD09ZT9PdSh0KTpJdSh0LCJudW1iZXIiPT10eXBlb2YgZT9bZSxlLGUsZV06ZSl9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gSXUodCxuKX1pZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gczt2YXIgcjtyZXR1cm4gZj1udWxsPT0ocz1uKT9PdToiZnVuY3Rpb24iPT0ocj10eXBlb2Ygbik/dDoibnVtYmVyIj09PXI/KG49W24sbixuLG5dLGUpOmUsaX0saS5yb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1uP01hdGgucm91bmQ6TnVtYmVyLGkpOmwhPU51bWJlcn0saS5zdGlja3k9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9bixhPW51bGwsaSk6aH0saS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1uLGkpOnB9LGkubW9kZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz1uKyIiLGkpOmd9LHV1KGksbyl9LG9hLnJhbmRvbT17bm9ybWFsOmZ1bmN0aW9uKG4sdCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gMj5lJiYodD0xKSwxPmUmJihuPTApLGZ1bmN0aW9uKCl7dmFyIGUscix1O2RvIGU9MipNYXRoLnJhbmRvbSgpLTEscj0yKk1hdGgucmFuZG9tKCktMSx1PWUqZStyKnI7d2hpbGUoIXV8fHU+MSk7cmV0dXJuIG4rdCplKk1hdGguc3FydCgtMipNYXRoLmxvZyh1KS91KX19LGxvZ05vcm1hbDpmdW5jdGlvbigpe3ZhciBuPW9hLnJhbmRvbS5ub3JtYWwuYXBwbHkob2EsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAobigpKX19LGJhdGVzOmZ1bmN0aW9uKG4pe3ZhciB0PW9hLnJhbmRvbS5pcndpbkhhbGwobik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQoKS9ufX0saXJ3aW5IYWxsOmZ1bmN0aW9uKG4pe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9MDtuPmU7ZSsrKXQrPU1hdGgucmFuZG9tKCk7cmV0dXJuIHR9fX0sb2Euc2NhbGU9e307dmFyIHdsPXtmbG9vcjp5LGNlaWw6eX07b2Euc2NhbGUubGluZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIFd1KFswLDFdLFswLDFdLE1yLCExKX07dmFyIFNsPXtzOjEsZzoxLHA6MSxyOjEsZToxfTtvYS5zY2FsZS5sb2c9ZnVuY3Rpb24oKXtyZXR1cm4gcmkob2Euc2NhbGUubGluZWFyKCkuZG9tYWluKFswLDFdKSwxMCwhMCxbMSwxMF0pfTt2YXIga2w9b2EuZm9ybWF0KCIuMGUiKSxObD17Zmxvb3I6ZnVuY3Rpb24obil7cmV0dXJuLU1hdGguY2VpbCgtbil9LGNlaWw6ZnVuY3Rpb24obil7cmV0dXJuLU1hdGguZmxvb3IoLW4pfX07b2Euc2NhbGUucG93PWZ1bmN0aW9uKCl7cmV0dXJuIHVpKG9hLnNjYWxlLmxpbmVhcigpLDEsWzAsMV0pfSxvYS5zY2FsZS5zcXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIG9hLnNjYWxlLnBvdygpLmV4cG9uZW50KC41KX0sb2Euc2NhbGUub3JkaW5hbD1mdW5jdGlvbigpe3JldHVybiBhaShbXSx7dDoicmFuZ2UiLGE6W1tdXX0pfSxvYS5zY2FsZS5jYXRlZ29yeTEwPWZ1bmN0aW9uKCl7cmV0dXJuIG9hLnNjYWxlLm9yZGluYWwoKS5yYW5nZShFbCl9LG9hLnNjYWxlLmNhdGVnb3J5MjA9ZnVuY3Rpb24oKXtyZXR1cm4gb2Euc2NhbGUub3JkaW5hbCgpLnJhbmdlKEFsKX0sb2Euc2NhbGUuY2F0ZWdvcnkyMGI9ZnVuY3Rpb24oKXtyZXR1cm4gb2Euc2NhbGUub3JkaW5hbCgpLnJhbmdlKENsKX0sb2Euc2NhbGUuY2F0ZWdvcnkyMGM9ZnVuY3Rpb24oKXtyZXR1cm4gb2Euc2NhbGUub3JkaW5hbCgpLnJhbmdlKHpsKX07dmFyIEVsPVsyMDYyMjYwLDE2NzQ0MjA2LDI5MjQ1ODgsMTQwMzQ3MjgsOTcyNTg4NSw5MTk3MTMxLDE0OTA3MzMwLDgzNTU3MTEsMTIzNjkxODYsMTU1NjE3NV0ubWFwKHhuKSxBbD1bMjA2MjI2MCwxMTQ1NDQ0MCwxNjc0NDIwNiwxNjc1OTY3MiwyOTI0NTg4LDEwMDE4Njk4LDE0MDM0NzI4LDE2NzUwNzQyLDk3MjU4ODUsMTI5NTU4NjEsOTE5NzEzMSwxMjg4NTE0MCwxNDkwNzMzMCwxNjIzNDE5NCw4MzU1NzExLDEzMDkyODA3LDEyMzY5MTg2LDE0NDA4NTg5LDE1NTYxNzUsMTA0MTA3MjVdLm1hcCh4biksQ2w9WzM3NTA3NzcsNTM5NTYxOSw3MDQwNzE5LDEwMjY0Mjg2LDY1MTkwOTcsOTIxNjU5NCwxMTkxNTExNSwxMzU1NjYzNiw5MjAyOTkzLDEyNDI2ODA5LDE1MTg2NTE0LDE1MTkwOTMyLDg2NjYxNjksMTEzNTY0OTAsMTQwNDk2NDMsMTUxNzczNzIsODA3NzY4MywxMDgzNDMyNCwxMzUyODUwOSwxNDU4OTY1NF0ubWFwKHhuKSx6bD1bMzI0NDczMyw3MDU3MTEwLDEwNDA2NjI1LDEzMDMyNDMxLDE1MDk1MDUzLDE2NjE2NzY0LDE2NjI1MjU5LDE2NjM0MDE4LDMyNTMwNzYsNzY1MjQ3MCwxMDYwNzAwMywxMzEwMTUwNCw3Njk1MjgxLDEwMzk0MzEyLDEyMzY5MzcyLDE0MzQyODkxLDY1MTM1MDcsOTg2ODk1MCwxMjQzNDg3NywxNDI3NzA4MV0ubWFwKHhuKTtvYS5zY2FsZS5xdWFudGlsZT1mdW5jdGlvbigpe3JldHVybiBvaShbXSxbXSl9LG9hLnNjYWxlLnF1YW50aXplPWZ1bmN0aW9uKCl7cmV0dXJuIGxpKDAsMSxbMCwxXSl9LG9hLnNjYWxlLnRocmVzaG9sZD1mdW5jdGlvbigpe3JldHVybiBjaShbLjVdLFswLDFdKX0sb2Euc2NhbGUuaWRlbnRpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gc2koWzAsMV0pfSxvYS5zdmc9e30sb2Euc3ZnLmFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbj1NYXRoLm1heCgwLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksYz1NYXRoLm1heCgwLCtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkscz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1IYSxmPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLUhhLGg9TWF0aC5hYnMoZi1zKSxnPXM+Zj8wOjE7aWYobj5jJiYocD1jLGM9bixuPXApLGg+PUZhKXJldHVybiB0KGMsZykrKG4/dChuLDEtZyk6IiIpKyJaIjt2YXIgcCx2LGQsbSx5LE0seCxiLF8sdyxTLGssTj0wLEU9MCxBPVtdO2lmKChtPSgrbC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fDApLzIpJiYoZD1pPT09TGw/TWF0aC5zcXJ0KG4qbitjKmMpOitpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxnfHwoRSo9LTEpLGMmJihFPXRuKGQvYypNYXRoLnNpbihtKSkpLG4mJihOPXRuKGQvbipNYXRoLnNpbihtKSkpKSxjKXt5PWMqTWF0aC5jb3MocytFKSxNPWMqTWF0aC5zaW4ocytFKSx4PWMqTWF0aC5jb3MoZi1FKSxiPWMqTWF0aC5zaW4oZi1FKTt2YXIgQz1NYXRoLmFicyhmLXMtMipFKTw9VWE/MDoxO2lmKEUmJm1pKHksTSx4LGIpPT09Z15DKXt2YXIgej0ocytmKS8yO3k9YypNYXRoLmNvcyh6KSxNPWMqTWF0aC5zaW4oeikseD1iPW51bGx9fWVsc2UgeT1NPTA7aWYobil7Xz1uKk1hdGguY29zKGYtTiksdz1uKk1hdGguc2luKGYtTiksUz1uKk1hdGguY29zKHMrTiksaz1uKk1hdGguc2luKHMrTik7dmFyIEw9TWF0aC5hYnMocy1mKzIqTik8PVVhPzA6MTtpZihOJiZtaShfLHcsUyxrKT09PTEtZ15MKXt2YXIgcT0ocytmKS8yO189bipNYXRoLmNvcyhxKSx3PW4qTWF0aC5zaW4ocSksUz1rPW51bGx9fWVsc2UgXz13PTA7aWYoaD5EYSYmKHA9TWF0aC5taW4oTWF0aC5hYnMoYy1uKS8yLCt1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkpPi4wMDEpe3Y9Yz5uXmc/MDoxO3ZhciBUPXAsUj1wO2lmKFVhPmgpe3ZhciBEPW51bGw9PVM/W18sd106bnVsbD09eD9beSxNXTpSZShbeSxNXSxbUyxrXSxbeCxiXSxbXyx3XSksUD15LURbMF0sVT1NLURbMV0saj14LURbMF0sRj1iLURbMV0sSD0xL01hdGguc2luKE1hdGguYWNvcygoUCpqK1UqRikvKE1hdGguc3FydChQKlArVSpVKSpNYXRoLnNxcnQoaipqK0YqRikpKS8yKSxPPU1hdGguc3FydChEWzBdKkRbMF0rRFsxXSpEWzFdKTtSPU1hdGgubWluKHAsKG4tTykvKEgtMSkpLFQ9TWF0aC5taW4ocCwoYy1PKS8oSCsxKSl9aWYobnVsbCE9eCl7dmFyIEk9eWkobnVsbD09Uz9bXyx3XTpbUyxrXSxbeSxNXSxjLFQsZyksWT15aShbeCxiXSxbXyx3XSxjLFQsZyk7cD09PVQ/QS5wdXNoKCJNIixJWzBdLCJBIixULCIsIixULCIgMCAwLCIsdiwiICIsSVsxXSwiQSIsYywiLCIsYywiIDAgIiwxLWdebWkoSVsxXVswXSxJWzFdWzFdLFlbMV1bMF0sWVsxXVsxXSksIiwiLGcsIiAiLFlbMV0sIkEiLFQsIiwiLFQsIiAwIDAsIix2LCIgIixZWzBdKTpBLnB1c2goIk0iLElbMF0sIkEiLFQsIiwiLFQsIiAwIDEsIix2LCIgIixZWzBdKX1lbHNlIEEucHVzaCgiTSIseSwiLCIsTSk7aWYobnVsbCE9Uyl7dmFyIFo9eWkoW3ksTV0sW1Msa10sbiwtUixnKSxWPXlpKFtfLHddLG51bGw9PXg/W3ksTV06W3gsYl0sbiwtUixnKTtwPT09Uj9BLnB1c2goIkwiLFZbMF0sIkEiLFIsIiwiLFIsIiAwIDAsIix2LCIgIixWWzFdLCJBIixuLCIsIixuLCIgMCAiLGdebWkoVlsxXVswXSxWWzFdWzFdLFpbMV1bMF0sWlsxXVsxXSksIiwiLDEtZywiICIsWlsxXSwiQSIsUiwiLCIsUiwiIDAgMCwiLHYsIiAiLFpbMF0pOkEucHVzaCgiTCIsVlswXSwiQSIsUiwiLCIsUiwiIDAgMCwiLHYsIiAiLFpbMF0pfWVsc2UgQS5wdXNoKCJMIixfLCIsIix3KX1lbHNlIEEucHVzaCgiTSIseSwiLCIsTSksbnVsbCE9eCYmQS5wdXNoKCJBIixjLCIsIixjLCIgMCAiLEMsIiwiLGcsIiAiLHgsIiwiLGIpLEEucHVzaCgiTCIsXywiLCIsdyksbnVsbCE9UyYmQS5wdXNoKCJBIixuLCIsIixuLCIgMCAiLEwsIiwiLDEtZywiICIsUywiLCIsayk7cmV0dXJuIEEucHVzaCgiWiIpLEEuam9pbigiIil9ZnVuY3Rpb24gdChuLHQpe3JldHVybiJNMCwiK24rIkEiK24rIiwiK24rIiAwIDEsIit0KyIgMCwiKy1uKyJBIituKyIsIituKyIgMCAxLCIrdCsiIDAsIitufXZhciBlPWhpLHI9Z2ksdT1maSxpPUxsLGE9cGksbz12aSxsPWRpO3JldHVybiBuLmlubmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUVuKHQpLG4pOmV9LG4ub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9RW4odCksbik6cn0sbi5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9RW4odCksbik6dX0sbi5wYWRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dD09TGw/TGw6RW4odCksbik6aX0sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPUVuKHQpLG4pOmF9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89RW4odCksbik6b30sbi5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1Fbih0KSxuKTpsfSxuLmNlbnRyb2lkPWZ1bmN0aW9uKCl7dmFyIG49KCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLHQ9KCthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK28uYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLUhhO3JldHVybltNYXRoLmNvcyh0KSpuLE1hdGguc2luKHQpKm5dfSxufTt2YXIgTGw9ImF1dG8iO29hLnN2Zy5saW5lPWZ1bmN0aW9uKCl7cmV0dXJuIE1pKHkpfTt2YXIgcWw9b2EubWFwKHtsaW5lYXI6eGksImxpbmVhci1jbG9zZWQiOmJpLHN0ZXA6X2ksInN0ZXAtYmVmb3JlIjp3aSwic3RlcC1hZnRlciI6U2ksYmFzaXM6emksImJhc2lzLW9wZW4iOkxpLCJiYXNpcy1jbG9zZWQiOnFpLGJ1bmRsZTpUaSxjYXJkaW5hbDpFaSwiY2FyZGluYWwtb3BlbiI6a2ksImNhcmRpbmFsLWNsb3NlZCI6TmksbW9ub3RvbmU6Rml9KTtxbC5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7dC5rZXk9bix0LmNsb3NlZD0vLWNsb3NlZCQvLnRlc3Qobil9KTt2YXIgVGw9WzAsMi8zLDEvMywwXSxSbD1bMCwxLzMsMi8zLDBdLERsPVswLDEvNiwyLzMsMS82XTtvYS5zdmcubGluZS5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgbj1NaShIaSk7cmV0dXJuIG4ucmFkaXVzPW4ueCxkZWxldGUgbi54LG4uYW5nbGU9bi55LGRlbGV0ZSBuLnksbn0sd2kucmV2ZXJzZT1TaSxTaS5yZXZlcnNlPXdpLG9hLnN2Zy5hcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIE9pKHkpfSxvYS5zdmcuYXJlYS5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgbj1PaShIaSk7cmV0dXJuIG4ucmFkaXVzPW4ueCxkZWxldGUgbi54LG4uaW5uZXJSYWRpdXM9bi54MCxkZWxldGUgbi54MCxuLm91dGVyUmFkaXVzPW4ueDEsZGVsZXRlIG4ueDEsbi5hbmdsZT1uLnksZGVsZXRlIG4ueSxuLnN0YXJ0QW5nbGU9bi55MCxkZWxldGUgbi55MCxuLmVuZEFuZ2xlPW4ueTEsZGVsZXRlIG4ueTEsbn0sb2Euc3ZnLmNob3JkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLG8pe3ZhciBsPXQodGhpcyxpLG4sbyksYz10KHRoaXMsYSxuLG8pO3JldHVybiJNIitsLnAwK3IobC5yLGwucDEsbC5hMS1sLmEwKSsoZShsLGMpP3UobC5yLGwucDEsbC5yLGwucDApOnUobC5yLGwucDEsYy5yLGMucDApK3IoYy5yLGMucDEsYy5hMS1jLmEwKSt1KGMucixjLnAxLGwucixsLnAwKSkrIloifWZ1bmN0aW9uIHQobix0LGUscil7dmFyIHU9dC5jYWxsKG4sZSxyKSxpPW8uY2FsbChuLHUsciksYT1sLmNhbGwobix1LHIpLUhhLHM9Yy5jYWxsKG4sdSxyKS1IYTtyZXR1cm57cjppLGEwOmEsYTE6cyxwMDpbaSpNYXRoLmNvcyhhKSxpKk1hdGguc2luKGEpXSxwMTpbaSpNYXRoLmNvcyhzKSxpKk1hdGguc2luKHMpXX19ZnVuY3Rpb24gZShuLHQpe3JldHVybiBuLmEwPT10LmEwJiZuLmExPT10LmExfWZ1bmN0aW9uIHIobix0LGUpe3JldHVybiJBIituKyIsIituKyIgMCAiKyArKGU+VWEpKyIsMSAiK3R9ZnVuY3Rpb24gdShuLHQsZSxyKXtyZXR1cm4iUSAwLDAgIityfXZhciBpPU1lLGE9eGUsbz1JaSxsPXBpLGM9dmk7cmV0dXJuIG4ucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPUVuKHQpLG4pOm99LG4uc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUVuKHQpLG4pOml9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPUVuKHQpLG4pOmF9LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1Fbih0KSxuKTpsfSxuLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPUVuKHQpLG4pOmN9LG59LG9hLnN2Zy5kaWFnb25hbD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix1KXt2YXIgaT10LmNhbGwodGhpcyxuLHUpLGE9ZS5jYWxsKHRoaXMsbix1KSxvPShpLnkrYS55KS8yLGw9W2kse3g6aS54LHk6b30se3g6YS54LHk6b30sYV07cmV0dXJuIGw9bC5tYXAociksIk0iK2xbMF0rIkMiK2xbMV0rIiAiK2xbMl0rIiAiK2xbM119dmFyIHQ9TWUsZT14ZSxyPVlpO3JldHVybiBuLnNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1FbihlKSxuKTp0fSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1Fbih0KSxuKTplfSxuLnByb2plY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxufSxvYS5zdmcuZGlhZ29uYWwucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49b2Euc3ZnLmRpYWdvbmFsKCksdD1ZaSxlPW4ucHJvamVjdGlvbjtyZXR1cm4gbi5wcm9qZWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoWmkodD1uKSk6dH0sbn0sb2Euc3ZnLnN5bWJvbD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixyKXtyZXR1cm4oUGwuZ2V0KHQuY2FsbCh0aGlzLG4scikpfHwkaSkoZS5jYWxsKHRoaXMsbixyKSl9dmFyIHQ9WGksZT1WaTtyZXR1cm4gbi50eXBlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PUVuKGUpLG4pOnR9LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1Fbih0KSxuKTplfSxufTt2YXIgUGw9b2EubWFwKHtjaXJjbGU6JGksY3Jvc3M6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vNSkvMjtyZXR1cm4iTSIrLTMqdCsiLCIrLXQrIkgiKy10KyJWIistMyp0KyJIIit0KyJWIistdCsiSCIrMyp0KyJWIit0KyJIIit0KyJWIiszKnQrIkgiKy10KyJWIit0KyJIIistMyp0KyJaIn0sZGlhbW9uZDpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi8oMipqbCkpLGU9dCpqbDtyZXR1cm4iTTAsIistdCsiTCIrZSsiLDAgMCwiK3QrIiAiKy1lKyIsMFoifSxzcXVhcmU6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4pLzI7cmV0dXJuIk0iKy10KyIsIistdCsiTCIrdCsiLCIrLXQrIiAiK3QrIiwiK3QrIiAiKy10KyIsIit0KyJaIn0sInRyaWFuZ2xlLWRvd24iOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuL1VsKSxlPXQqVWwvMjtyZXR1cm4iTTAsIitlKyJMIit0KyIsIistZSsiICIrLXQrIiwiKy1lKyJaIn0sInRyaWFuZ2xlLXVwIjpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi9VbCksZT10KlVsLzI7cmV0dXJuIk0wLCIrLWUrIkwiK3QrIiwiK2UrIiAiKy10KyIsIitlKyJaIn19KTtvYS5zdmcuc3ltYm9sVHlwZXM9UGwua2V5cygpO3ZhciBVbD1NYXRoLnNxcnQoMyksamw9TWF0aC50YW4oMzAqT2EpO0FhLnRyYW5zaXRpb249ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscj1GbHx8KytZbCx1PUtpKG4pLGk9W10sYT1IbHx8e3RpbWU6RGF0ZS5ub3coKSxlYXNlOk5yLGRlbGF5OjAsZHVyYXRpb246MjUwfSxvPS0xLGw9dGhpcy5sZW5ndGg7KytvPGw7KXtpLnB1c2godD1bXSk7Zm9yKHZhciBjPXRoaXNbb10scz0tMSxmPWMubGVuZ3RoOysrczxmOykoZT1jW3NdKSYmUWkoZSxzLHUscixhKSx0LnB1c2goZSl9cmV0dXJuIFdpKGksdSxyKX0sQWEuaW50ZXJydXB0PWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmVhY2gobnVsbD09bj9PbDpCaShLaShuKSkpfTt2YXIgRmwsSGwsT2w9QmkoS2koKSksSWw9W10sWWw9MDtJbC5jYWxsPUFhLmNhbGwsSWwuZW1wdHk9QWEuZW1wdHksSWwubm9kZT1BYS5ub2RlLElsLnNpemU9QWEuc2l6ZSxvYS50cmFuc2l0aW9uPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4mJm4udHJhbnNpdGlvbj9GbD9uLnRyYW5zaXRpb24odCk6bjpvYS5zZWxlY3Rpb24oKS50cmFuc2l0aW9uKG4pfSxvYS50cmFuc2l0aW9uLnByb3RvdHlwZT1JbCxJbC5zZWxlY3Q9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9dGhpcy5pZCxpPXRoaXMubmFtZXNwYWNlLGE9W107bj1BKG4pO2Zvcih2YXIgbz0tMSxsPXRoaXMubGVuZ3RoOysrbzxsOyl7YS5wdXNoKHQ9W10pO2Zvcih2YXIgYz10aGlzW29dLHM9LTEsZj1jLmxlbmd0aDsrK3M8ZjspKHI9Y1tzXSkmJihlPW4uY2FsbChyLHIuX19kYXRhX18scyxvKSk/KCJfX2RhdGFfXyJpbiByJiYoZS5fX2RhdGFfXz1yLl9fZGF0YV9fKSxRaShlLHMsaSx1LHJbaV1bdV0pLHQucHVzaChlKSk6dC5wdXNoKG51bGwpfXJldHVybiBXaShhLGksdSl9LElsLnNlbGVjdEFsbD1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdSxpLGE9dGhpcy5pZCxvPXRoaXMubmFtZXNwYWNlLGw9W107bj1DKG4pO2Zvcih2YXIgYz0tMSxzPXRoaXMubGVuZ3RoOysrYzxzOylmb3IodmFyIGY9dGhpc1tjXSxoPS0xLGc9Zi5sZW5ndGg7KytoPGc7KWlmKHI9ZltoXSl7aT1yW29dW2FdLGU9bi5jYWxsKHIsci5fX2RhdGFfXyxoLGMpLGwucHVzaCh0PVtdKTtmb3IodmFyIHA9LTEsdj1lLmxlbmd0aDsrK3A8djspKHU9ZVtwXSkmJlFpKHUscCxvLGEsaSksdC5wdXNoKHUpfXJldHVybiBXaShsLG8sYSl9LElsLmZpbHRlcj1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdT1bXTsiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49TyhuKSk7Zm9yKHZhciBpPTAsYT10aGlzLmxlbmd0aDthPmk7aSsrKXt1LnB1c2godD1bXSk7Zm9yKHZhciBlPXRoaXNbaV0sbz0wLGw9ZS5sZW5ndGg7bD5vO28rKykocj1lW29dKSYmbi5jYWxsKHIsci5fX2RhdGFfXyxvLGkpJiZ0LnB1c2gocil9cmV0dXJuIFdpKHUsdGhpcy5uYW1lc3BhY2UsdGhpcy5pZCl9LElsLnR3ZWVuPWZ1bmN0aW9uKG4sdCl7dmFyIGU9dGhpcy5pZCxyPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpcy5ub2RlKClbcl1bZV0udHdlZW4uZ2V0KG4pOlkodGhpcyxudWxsPT10P2Z1bmN0aW9uKHQpe3Rbcl1bZV0udHdlZW4ucmVtb3ZlKG4pfTpmdW5jdGlvbih1KXt1W3JdW2VdLnR3ZWVuLnNldChuLHQpfSl9LElsLmF0dHI9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUobyl9ZnVuY3Rpb24gcigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlMoby5zcGFjZSxvLmxvY2FsKX1mdW5jdGlvbiB1KG4pe3JldHVybiBudWxsPT1uP2U6KG4rPSIiLGZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmdldEF0dHJpYnV0ZShvKTtyZXR1cm4gZSE9PW4mJih0PWEoZSxuKSxmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZShvLHQobikpfSl9KX1mdW5jdGlvbiBpKG4pe3JldHVybiBudWxsPT1uP3I6KG4rPSIiLGZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmdldEF0dHJpYnV0ZU5TKG8uc3BhY2Usby5sb2NhbCk7cmV0dXJuIGUhPT1uJiYodD1hKGUsbiksZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGVOUyhvLnNwYWNlLG8ubG9jYWwsdChuKSl9KX0pfWlmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHQgaW4gbil0aGlzLmF0dHIodCxuW3RdKTtyZXR1cm4gdGhpc312YXIgYT0idHJhbnNmb3JtIj09bj8kcjpNcixvPW9hLm5zLnF1YWxpZnkobik7cmV0dXJuIEppKHRoaXMsImF0dHIuIituLHQsby5sb2NhbD9pOnUpfSxJbC5hdHRyVHdlZW49ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4sZSl7dmFyIHI9dC5jYWxsKHRoaXMsbixlLHRoaXMuZ2V0QXR0cmlidXRlKHUpKTtyZXR1cm4gciYmZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGUodSxyKG4pKX19ZnVuY3Rpb24gcihuLGUpe3ZhciByPXQuY2FsbCh0aGlzLG4sZSx0aGlzLmdldEF0dHJpYnV0ZU5TKHUuc3BhY2UsdS5sb2NhbCkpO3JldHVybiByJiZmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHUuc3BhY2UsdS5sb2NhbCxyKG4pKX19dmFyIHU9b2EubnMucXVhbGlmeShuKTtyZXR1cm4gdGhpcy50d2VlbigiYXR0ci4iK24sdS5sb2NhbD9yOmUpfSxJbC5zdHlsZT1mdW5jdGlvbihuLGUscil7ZnVuY3Rpb24gdSgpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobil9ZnVuY3Rpb24gaShlKXtyZXR1cm4gbnVsbD09ZT91OihlKz0iIixmdW5jdGlvbigpe3ZhciB1LGk9dCh0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKTtyZXR1cm4gaSE9PWUmJih1PU1yKGksZSksZnVuY3Rpb24odCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHUodCkscil9KX0pfXZhciBhPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5hKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+YSYmKGU9IiIpO2ZvcihyIGluIG4pdGhpcy5zdHlsZShyLG5bcl0sZSk7cmV0dXJuIHRoaXN9cj0iIn1yZXR1cm4gSmkodGhpcywic3R5bGUuIituLGUsaSl9LElsLnN0eWxlVHdlZW49ZnVuY3Rpb24obixlLHIpe2Z1bmN0aW9uIHUodSxpKXt2YXIgYT1lLmNhbGwodGhpcyx1LGksdCh0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKSk7cmV0dXJuIGEmJmZ1bmN0aW9uKHQpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkobixhKHQpLHIpfX1yZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwzJiYocj0iIiksdGhpcy50d2Vlbigic3R5bGUuIituLHUpfSxJbC50ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBKaSh0aGlzLCJ0ZXh0IixuLEdpKX0sSWwucmVtb3ZlPWZ1bmN0aW9uKCl7dmFyIG49dGhpcy5uYW1lc3BhY2U7cmV0dXJuIHRoaXMuZWFjaCgiZW5kLnRyYW5zaXRpb24iLGZ1bmN0aW9uKCl7dmFyIHQ7dGhpc1tuXS5jb3VudDwyJiYodD10aGlzLnBhcmVudE5vZGUpJiZ0LnJlbW92ZUNoaWxkKHRoaXMpfSl9LElsLmVhc2U9ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZWFzZTooImZ1bmN0aW9uIiE9dHlwZW9mIG4mJihuPW9hLmVhc2UuYXBwbHkob2EsYXJndW1lbnRzKSksWSh0aGlzLGZ1bmN0aW9uKHIpe3JbZV1bdF0uZWFzZT1ufSkpfSxJbC5kZWxheT1mdW5jdGlvbihuKXt2YXIgdD10aGlzLmlkLGU9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKVtlXVt0XS5kZWxheTpZKHRoaXMsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24ocix1LGkpe3JbZV1bdF0uZGVsYXk9K24uY2FsbChyLHIuX19kYXRhX18sdSxpKX06KG49K24sZnVuY3Rpb24ocil7cltlXVt0XS5kZWxheT1ufSkpfSxJbC5kdXJhdGlvbj1mdW5jdGlvbihuKXt2YXIgdD10aGlzLmlkLGU9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKVtlXVt0XS5kdXJhdGlvbjpZKHRoaXMsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24ocix1LGkpe3JbZV1bdF0uZHVyYXRpb249TWF0aC5tYXgoMSxuLmNhbGwocixyLl9fZGF0YV9fLHUsaSkpfToobj1NYXRoLm1heCgxLG4pLGZ1bmN0aW9uKHIpe3JbZV1bdF0uZHVyYXRpb249bn0pKX0sSWwuZWFjaD1mdW5jdGlvbihuLHQpe3ZhciBlPXRoaXMuaWQscj10aGlzLm5hbWVzcGFjZTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciB1PUhsLGk9Rmw7dHJ5e0ZsPWUsWSh0aGlzLGZ1bmN0aW9uKHQsdSxpKXtIbD10W3JdW2VdLG4uY2FsbCh0LHQuX19kYXRhX18sdSxpKX0pfWZpbmFsbHl7SGw9dSxGbD1pfX1lbHNlIFkodGhpcyxmdW5jdGlvbih1KXt2YXIgaT11W3JdW2VdOyhpLmV2ZW50fHwoaS5ldmVudD1vYS5kaXNwYXRjaCgic3RhcnQiLCJlbmQiLCJpbnRlcnJ1cHQiKSkpLm9uKG4sdCl9KTtyZXR1cm4gdGhpc30sSWwudHJhbnNpdGlvbj1mdW5jdGlvbigpe2Zvcih2YXIgbix0LGUscix1PXRoaXMuaWQsaT0rK1lsLGE9dGhpcy5uYW1lc3BhY2Usbz1bXSxsPTAsYz10aGlzLmxlbmd0aDtjPmw7bCsrKXtvLnB1c2gobj1bXSk7Zm9yKHZhciB0PXRoaXNbbF0scz0wLGY9dC5sZW5ndGg7Zj5zO3MrKykoZT10W3NdKSYmKHI9ZVthXVt1XSxRaShlLHMsYSxpLHt0aW1lOnIudGltZSxlYXNlOnIuZWFzZSxkZWxheTpyLmRlbGF5K3IuZHVyYXRpb24sZHVyYXRpb246ci5kdXJhdGlvbn0pKSxuLnB1c2goZSl9cmV0dXJuIFdpKG8sYSxpKX0sb2Euc3ZnLmF4aXM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuLGM9b2Euc2VsZWN0KHRoaXMpLHM9dGhpcy5fX2NoYXJ0X198fGUsZj10aGlzLl9fY2hhcnRfXz1lLmNvcHkoKSxoPW51bGw9PWw/Zi50aWNrcz9mLnRpY2tzLmFwcGx5KGYsbyk6Zi5kb21haW4oKTpsLGc9bnVsbD09dD9mLnRpY2tGb3JtYXQ/Zi50aWNrRm9ybWF0LmFwcGx5KGYsbyk6eTp0LHA9Yy5zZWxlY3RBbGwoIi50aWNrIikuZGF0YShoLGYpLHY9cC5lbnRlcigpLmluc2VydCgiZyIsIi5kb21haW4iKS5hdHRyKCJjbGFzcyIsInRpY2siKS5zdHlsZSgib3BhY2l0eSIsRGEpLGQ9b2EudHJhbnNpdGlvbihwLmV4aXQoKSkuc3R5bGUoIm9wYWNpdHkiLERhKS5yZW1vdmUoKSxtPW9hLnRyYW5zaXRpb24ocC5vcmRlcigpKS5zdHlsZSgib3BhY2l0eSIsMSksTT1NYXRoLm1heCh1LDApK2EseD1adShmKSxiPWMuc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbMF0pLF89KGIuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJjbGFzcyIsImRvbWFpbiIpLG9hLnRyYW5zaXRpb24oYikpO3YuYXBwZW5kKCJsaW5lIiksdi5hcHBlbmQoInRleHQiKTt2YXIgdyxTLGssTixFPXYuc2VsZWN0KCJsaW5lIiksQT1tLnNlbGVjdCgibGluZSIpLEM9cC5zZWxlY3QoInRleHQiKS50ZXh0KGcpLHo9di5zZWxlY3QoInRleHQiKSxMPW0uc2VsZWN0KCJ0ZXh0IikscT0idG9wIj09PXJ8fCJsZWZ0Ij09PXI/LTE6MTtpZigiYm90dG9tIj09PXJ8fCJ0b3AiPT09cj8obj1uYSx3PSJ4IixrPSJ5IixTPSJ4MiIsTj0ieTIiLEMuYXR0cigiZHkiLDA+cT8iMGVtIjoiLjcxZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKSxfLmF0dHIoImQiLCJNIit4WzBdKyIsIitxKmkrIlYwSCIreFsxXSsiViIrcSppKSk6KG49dGEsdz0ieSIsaz0ieCIsUz0ieTIiLE49IngyIixDLmF0dHIoImR5IiwiLjMyZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLDA+cT8iZW5kIjoic3RhcnQiKSxfLmF0dHIoImQiLCJNIitxKmkrIiwiK3hbMF0rIkgwViIreFsxXSsiSCIrcSppKSksRS5hdHRyKE4scSp1KSx6LmF0dHIoayxxKk0pLEEuYXR0cihTLDApLmF0dHIoTixxKnUpLEwuYXR0cih3LDApLmF0dHIoayxxKk0pLGYucmFuZ2VCYW5kKXt2YXIgVD1mLFI9VC5yYW5nZUJhbmQoKS8yO3M9Zj1mdW5jdGlvbihuKXtyZXR1cm4gVChuKStSfX1lbHNlIHMucmFuZ2VCYW5kP3M9ZjpkLmNhbGwobixmLHMpO3YuY2FsbChuLHMsZiksbS5jYWxsKG4sZixmKX0pfXZhciB0LGU9b2Euc2NhbGUubGluZWFyKCkscj1abCx1PTYsaT02LGE9MyxvPVsxMF0sbD1udWxsO3JldHVybiBuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5vcmllbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCBpbiBWbD90KyIiOlpsLG4pOnJ9LG4udGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1jYShhcmd1bWVudHMpLG4pOm99LG4udGlja1ZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD10LG4pOmx9LG4udGlja0Zvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4udGlja1NpemU9ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gZT8odT0rdCxpPSthcmd1bWVudHNbZS0xXSxuKTp1fSxuLmlubmVyVGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3Qsbik6dX0sbi5vdXRlclRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG4pOml9LG4udGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3Qsbik6YX0sbi50aWNrU3ViZGl2aWRlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgmJm59LG59O3ZhciBabD0iYm90dG9tIixWbD17dG9wOjEscmlnaHQ6MSxib3R0b206MSxsZWZ0OjF9O29hLnN2Zy5icnVzaD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCl7dC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9b2Euc2VsZWN0KHRoaXMpLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIikub24oIm1vdXNlZG93bi5icnVzaCIsaSkub24oInRvdWNoc3RhcnQuYnJ1c2giLGkpLGE9dC5zZWxlY3RBbGwoIi5iYWNrZ3JvdW5kIikuZGF0YShbMF0pO2EuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImJhY2tncm91bmQiKS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpLnN0eWxlKCJjdXJzb3IiLCJjcm9zc2hhaXIiKSx0LnNlbGVjdEFsbCgiLmV4dGVudCIpLmRhdGEoWzBdKS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwiZXh0ZW50Iikuc3R5bGUoImN1cnNvciIsIm1vdmUiKTt2YXIgbz10LnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmRhdGEodix5KTtvLmV4aXQoKS5yZW1vdmUoKSxvLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLGZ1bmN0aW9uKG4pe3JldHVybiJyZXNpemUgIitufSkuc3R5bGUoImN1cnNvciIsZnVuY3Rpb24obil7cmV0dXJuIFhsW25dfSkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsZnVuY3Rpb24obil7cmV0dXJuL1tld10kLy50ZXN0KG4pPy0zOm51bGx9KS5hdHRyKCJ5IixmdW5jdGlvbihuKXtyZXR1cm4vXltuc10vLnRlc3Qobik/LTM6bnVsbH0pLmF0dHIoIndpZHRoIiw2KS5hdHRyKCJoZWlnaHQiLDYpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIiksby5zdHlsZSgiZGlzcGxheSIsbi5lbXB0eSgpPyJub25lIjpudWxsKTt2YXIgbCxmPW9hLnRyYW5zaXRpb24odCksaD1vYS50cmFuc2l0aW9uKGEpO2MmJihsPVp1KGMpLGguYXR0cigieCIsbFswXSkuYXR0cigid2lkdGgiLGxbMV0tbFswXSkscihmKSkscyYmKGw9WnUocyksaC5hdHRyKCJ5IixsWzBdKS5hdHRyKCJoZWlnaHQiLGxbMV0tbFswXSksdShmKSksZShmKX0pfWZ1bmN0aW9uIGUobil7bi5zZWxlY3RBbGwoIi5yZXNpemUiKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKG4pe3JldHVybiJ0cmFuc2xhdGUoIitmWysvZSQvLnRlc3QobildKyIsIitoWysvXnMvLnRlc3QobildKyIpIn0pfWZ1bmN0aW9uIHIobil7bi5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ4IixmWzBdKSxuLnNlbGVjdEFsbCgiLmV4dGVudCwubj5yZWN0LC5zPnJlY3QiKS5hdHRyKCJ3aWR0aCIsZlsxXS1mWzBdKX1mdW5jdGlvbiB1KG4pe24uc2VsZWN0KCIuZXh0ZW50IikuYXR0cigieSIsaFswXSksbi5zZWxlY3RBbGwoIi5leHRlbnQsLmU+cmVjdCwudz5yZWN0IikuYXR0cigiaGVpZ2h0IixoWzFdLWhbMF0pfWZ1bmN0aW9uIGkoKXtmdW5jdGlvbiBpKCl7MzI9PW9hLmV2ZW50LmtleUNvZGUmJihDfHwoTT1udWxsLExbMF0tPWZbMV0sTFsxXS09aFsxXSxDPTIpLFMoKSl9ZnVuY3Rpb24gdigpezMyPT1vYS5ldmVudC5rZXlDb2RlJiYyPT1DJiYoTFswXSs9ZlsxXSxMWzFdKz1oWzFdLEM9MCxTKCkpfWZ1bmN0aW9uIGQoKXt2YXIgbj1vYS5tb3VzZShiKSx0PSExO3gmJihuWzBdKz14WzBdLG5bMV0rPXhbMV0pLEN8fChvYS5ldmVudC5hbHRLZXk/KE18fChNPVsoZlswXStmWzFdKS8yLChoWzBdK2hbMV0pLzJdKSxMWzBdPWZbKyhuWzBdPE1bMF0pXSxMWzFdPWhbKyhuWzFdPE1bMV0pXSk6TT1udWxsKSxFJiZtKG4sYywwKSYmKHIoayksdD0hMCksQSYmbShuLHMsMSkmJih1KGspLHQ9ITApLHQmJihlKGspLHcoe3R5cGU6ImJydXNoIixtb2RlOkM/Im1vdmUiOiJyZXNpemUifSkpfWZ1bmN0aW9uIG0obix0LGUpe3ZhciByLHUsaT1adSh0KSxsPWlbMF0sYz1pWzFdLHM9TFtlXSx2PWU/aDpmLGQ9dlsxXS12WzBdO3JldHVybiBDJiYobC09cyxjLT1kK3MpLHI9KGU/cDpnKT9NYXRoLm1heChsLE1hdGgubWluKGMsbltlXSkpOm5bZV0sQz91PShyKz1zKStkOihNJiYocz1NYXRoLm1heChsLE1hdGgubWluKGMsMipNW2VdLXIpKSkscj5zPyh1PXIscj1zKTp1PXMpLHZbMF0hPXJ8fHZbMV0hPXU/KGU/bz1udWxsOmE9bnVsbCx2WzBdPXIsdlsxXT11LCEwKTp2b2lkIDB9ZnVuY3Rpb24geSgpe2QoKSxrLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLnN0eWxlKCJkaXNwbGF5IixuLmVtcHR5KCk/Im5vbmUiOm51bGwpLG9hLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLG51bGwpLHEub24oIm1vdXNlbW92ZS5icnVzaCIsbnVsbCkub24oIm1vdXNldXAuYnJ1c2giLG51bGwpLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLG51bGwpLm9uKCJ0b3VjaGVuZC5icnVzaCIsbnVsbCkub24oImtleWRvd24uYnJ1c2giLG51bGwpLm9uKCJrZXl1cC5icnVzaCIsbnVsbCkseigpLHcoe3R5cGU6ImJydXNoZW5kIn0pfXZhciBNLHgsYj10aGlzLF89b2Euc2VsZWN0KG9hLmV2ZW50LnRhcmdldCksdz1sLm9mKGIsYXJndW1lbnRzKSxrPW9hLnNlbGVjdChiKSxOPV8uZGF0dW0oKSxFPSEvXihufHMpJC8udGVzdChOKSYmYyxBPSEvXihlfHcpJC8udGVzdChOKSYmcyxDPV8uY2xhc3NlZCgiZXh0ZW50Iiksej1XKGIpLEw9b2EubW91c2UoYikscT1vYS5zZWxlY3QodChiKSkub24oImtleWRvd24uYnJ1c2giLGkpLm9uKCJrZXl1cC5icnVzaCIsdik7aWYob2EuZXZlbnQuY2hhbmdlZFRvdWNoZXM/cS5vbigidG91Y2htb3ZlLmJydXNoIixkKS5vbigidG91Y2hlbmQuYnJ1c2giLHkpOnEub24oIm1vdXNlbW92ZS5icnVzaCIsZCkub24oIm1vdXNldXAuYnJ1c2giLHkpLGsuaW50ZXJydXB0KCkuc2VsZWN0QWxsKCIqIikuaW50ZXJydXB0KCksQylMWzBdPWZbMF0tTFswXSxMWzFdPWhbMF0tTFsxXTtlbHNlIGlmKE4pe3ZhciBUPSsvdyQvLnRlc3QoTiksUj0rL15uLy50ZXN0KE4pO3g9W2ZbMS1UXS1MWzBdLGhbMS1SXS1MWzFdXSxMWzBdPWZbVF0sTFsxXT1oW1JdfWVsc2Ugb2EuZXZlbnQuYWx0S2V5JiYoTT1MLnNsaWNlKCkpO2suc3R5bGUoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKSxvYS5zZWxlY3QoImJvZHkiKS5zdHlsZSgiY3Vyc29yIixfLnN0eWxlKCJjdXJzb3IiKSksdyh7dHlwZToiYnJ1c2hzdGFydCJ9KSxkKCl9dmFyIGEsbyxsPU4obiwiYnJ1c2hzdGFydCIsImJydXNoIiwiYnJ1c2hlbmQiKSxjPW51bGwscz1udWxsLGY9WzAsMF0saD1bMCwwXSxnPSEwLHA9ITAsdj0kbFswXTtyZXR1cm4gbi5ldmVudD1mdW5jdGlvbihuKXtuLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1sLm9mKHRoaXMsYXJndW1lbnRzKSx0PXt4OmYseTpoLGk6YSxqOm99LGU9dGhpcy5fX2NoYXJ0X198fHQ7dGhpcy5fX2NoYXJ0X189dCxGbD9vYS5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goInN0YXJ0LmJydXNoIixmdW5jdGlvbigpe2E9ZS5pLG89ZS5qLGY9ZS54LGg9ZS55LG4oe3R5cGU6ImJydXNoc3RhcnQifSl9KS50d2VlbigiYnJ1c2g6YnJ1c2giLGZ1bmN0aW9uKCl7dmFyIGU9eHIoZix0LngpLHI9eHIoaCx0LnkpO3JldHVybiBhPW89bnVsbCxmdW5jdGlvbih1KXtmPXQueD1lKHUpLGg9dC55PXIodSksbih7dHlwZToiYnJ1c2giLG1vZGU6InJlc2l6ZSJ9KX19KS5lYWNoKCJlbmQuYnJ1c2giLGZ1bmN0aW9uKCl7YT10Lmksbz10Lmosbih7dHlwZToiYnJ1c2giLG1vZGU6InJlc2l6ZSJ9KSxuKHt0eXBlOiJicnVzaGVuZCJ9KX0pOihuKHt0eXBlOiJicnVzaHN0YXJ0In0pLG4oe3R5cGU6ImJydXNoIixtb2RlOiJyZXNpemUifSksbih7dHlwZToiYnJ1c2hlbmQifSkpfSl9LG4ueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz10LHY9JGxbIWM8PDF8IXNdLG4pOmN9LG4ueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10LHY9JGxbIWM8PDF8IXNdLG4pOnN9LG4uY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGMmJnM/KGc9ISF0WzBdLHA9ISF0WzFdKTpjP2c9ISF0OnMmJihwPSEhdCksbik6YyYmcz9bZyxwXTpjP2c6cz9wOm51bGx9LG4uZXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBlLHIsdSxpLGw7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGMmJihlPXRbMF0scj10WzFdLHMmJihlPWVbMF0scj1yWzBdKSxhPVtlLHJdLGMuaW52ZXJ0JiYoZT1jKGUpLHI9YyhyKSksZT5yJiYobD1lLGU9cixyPWwpLChlIT1mWzBdfHxyIT1mWzFdKSYmKGY9W2Uscl0pKSxzJiYodT10WzBdLGk9dFsxXSxjJiYodT11WzFdLGk9aVsxXSksbz1bdSxpXSxzLmludmVydCYmKHU9cyh1KSxpPXMoaSkpLHU+aSYmKGw9dSx1PWksaT1sKSwodSE9aFswXXx8aSE9aFsxXSkmJihoPVt1LGldKSksbik6KGMmJihhPyhlPWFbMF0scj1hWzFdKTooZT1mWzBdLHI9ZlsxXSxjLmludmVydCYmKGU9Yy5pbnZlcnQoZSkscj1jLmludmVydChyKSksZT5yJiYobD1lLGU9cixyPWwpKSkscyYmKG8/KHU9b1swXSxpPW9bMV0pOih1PWhbMF0saT1oWzFdLHMuaW52ZXJ0JiYodT1zLmludmVydCh1KSxpPXMuaW52ZXJ0KGkpKSx1PmkmJihsPXUsdT1pLGk9bCkpKSxjJiZzP1tbZSx1XSxbcixpXV06Yz9bZSxyXTpzJiZbdSxpXSl9LG4uY2xlYXI9ZnVuY3Rpb24oKXtyZXR1cm4gbi5lbXB0eSgpfHwoZj1bMCwwXSxoPVswLDBdLGE9bz1udWxsKSxufSxuLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuISFjJiZmWzBdPT1mWzFdfHwhIXMmJmhbMF09PWhbMV19LG9hLnJlYmluZChuLGwsIm9uIil9O3ZhciBYbD17bjoibnMtcmVzaXplIixlOiJldy1yZXNpemUiLHM6Im5zLXJlc2l6ZSIsdzoiZXctcmVzaXplIixudzoibndzZS1yZXNpemUiLG5lOiJuZXN3LXJlc2l6ZSIsc2U6Im53c2UtcmVzaXplIixzdzoibmVzdy1yZXNpemUifSwkbD1bWyJuIiwiZSIsInMiLCJ3IiwibnciLCJuZSIsInNlIiwic3ciXSxbImUiLCJ3Il0sWyJuIiwicyJdLFtdXSxCbD1oby5mb3JtYXQ9TW8udGltZUZvcm1hdCxXbD1CbC51dGMsSmw9V2woIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpO0JsLmlzbz1EYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyYmK25ldyBEYXRlKCIyMDAwLTAxLTAxVDAwOjAwOjAwLjAwMFoiKT9lYTpKbCxlYS5wYXJzZT1mdW5jdGlvbihuKXt2YXIgdD1uZXcgRGF0ZShuKTtyZXR1cm4gaXNOYU4odCk/bnVsbDp0fSxlYS50b1N0cmluZz1KbC50b1N0cmluZyxoby5zZWNvbmQ9T24oZnVuY3Rpb24obil7cmV0dXJuIG5ldyBnbygxZTMqTWF0aC5mbG9vcihuLzFlMykpfSxmdW5jdGlvbihuLHQpe24uc2V0VGltZShuLmdldFRpbWUoKSsxZTMqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFNlY29uZHMoKX0pLGhvLnNlY29uZHM9aG8uc2Vjb25kLnJhbmdlLGhvLnNlY29uZHMudXRjPWhvLnNlY29uZC51dGMucmFuZ2UsaG8ubWludXRlPU9uKGZ1bmN0aW9uKG4pe3JldHVybiBuZXcgZ28oNmU0Kk1hdGguZmxvb3Iobi82ZTQpKX0sZnVuY3Rpb24obix0KXtuLnNldFRpbWUobi5nZXRUaW1lKCkrNmU0Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNaW51dGVzKCl9KSxoby5taW51dGVzPWhvLm1pbnV0ZS5yYW5nZSxoby5taW51dGVzLnV0Yz1oby5taW51dGUudXRjLnJhbmdlLGhvLmhvdXI9T24oZnVuY3Rpb24obil7dmFyIHQ9bi5nZXRUaW1lem9uZU9mZnNldCgpLzYwO3JldHVybiBuZXcgZ28oMzZlNSooTWF0aC5mbG9vcihuLzM2ZTUtdCkrdCkpfSxmdW5jdGlvbihuLHQpe24uc2V0VGltZShuLmdldFRpbWUoKSszNmU1Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRIb3VycygpfSksaG8uaG91cnM9aG8uaG91ci5yYW5nZSxoby5ob3Vycy51dGM9aG8uaG91ci51dGMucmFuZ2UsaG8ubW9udGg9T24oZnVuY3Rpb24obil7cmV0dXJuIG49aG8uZGF5KG4pLG4uc2V0RGF0ZSgxKSxufSxmdW5jdGlvbihuLHQpe24uc2V0TW9udGgobi5nZXRNb250aCgpK3QpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNb250aCgpfSksaG8ubW9udGhzPWhvLm1vbnRoLnJhbmdlLGhvLm1vbnRocy51dGM9aG8ubW9udGgudXRjLnJhbmdlO3ZhciBHbD1bMWUzLDVlMywxNWUzLDNlNCw2ZTQsM2U1LDllNSwxOGU1LDM2ZTUsMTA4ZTUsMjE2ZTUsNDMyZTUsODY0ZTUsMTcyOGU1LDYwNDhlNSwyNTkyZTYsNzc3NmU2LDMxNTM2ZTZdLEtsPVtbaG8uc2Vjb25kLDFdLFtoby5zZWNvbmQsNV0sW2hvLnNlY29uZCwxNV0sW2hvLnNlY29uZCwzMF0sW2hvLm1pbnV0ZSwxXSxbaG8ubWludXRlLDVdLFtoby5taW51dGUsMTVdLFtoby5taW51dGUsMzBdLFtoby5ob3VyLDFdLFtoby5ob3VyLDNdLFtoby5ob3VyLDZdLFtoby5ob3VyLDEyXSxbaG8uZGF5LDFdLFtoby5kYXksMl0sW2hvLndlZWssMV0sW2hvLm1vbnRoLDFdLFtoby5tb250aCwzXSxbaG8ueWVhciwxXV0sUWw9QmwubXVsdGkoW1siLiVMIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNaWxsaXNlY29uZHMoKX1dLFsiOiVTIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRTZWNvbmRzKCl9XSxbIiVJOiVNIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNaW51dGVzKCl9XSxbIiVJICVwIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRIb3VycygpfV0sWyIlYSAlZCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RGF5KCkmJjEhPW4uZ2V0RGF0ZSgpfV0sWyIlYiAlZCIsZnVuY3Rpb24obil7cmV0dXJuIDEhPW4uZ2V0RGF0ZSgpfV0sWyIlQiIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TW9udGgoKX1dLFsiJVkiLHp0XV0pLG5jPXtyYW5nZTpmdW5jdGlvbihuLHQsZSl7cmV0dXJuIG9hLnJhbmdlKE1hdGguY2VpbChuL2UpKmUsK3QsZSkubWFwKHVhKX0sZmxvb3I6eSxjZWlsOnl9O0tsLnllYXI9aG8ueWVhcixoby5zY2FsZT1mdW5jdGlvbigpe3JldHVybiByYShvYS5zY2FsZS5saW5lYXIoKSxLbCxRbCl9O3ZhciB0Yz1LbC5tYXAoZnVuY3Rpb24obil7cmV0dXJuW25bMF0udXRjLG5bMV1dfSksZWM9V2wubXVsdGkoW1siLiVMIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENNaWxsaXNlY29uZHMoKX1dLFsiOiVTIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENTZWNvbmRzKCl9XSxbIiVJOiVNIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENNaW51dGVzKCl9XSxbIiVJICVwIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENIb3VycygpfV0sWyIlYSAlZCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDRGF5KCkmJjEhPW4uZ2V0VVRDRGF0ZSgpfV0sWyIlYiAlZCIsZnVuY3Rpb24obil7cmV0dXJuIDEhPW4uZ2V0VVRDRGF0ZSgpfV0sWyIlQiIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTW9udGgoKX1dLFsiJVkiLHp0XV0pO3RjLnllYXI9aG8ueWVhci51dGMsaG8uc2NhbGUudXRjPWZ1bmN0aW9uKCl7cmV0dXJuIHJhKG9hLnNjYWxlLmxpbmVhcigpLHRjLGVjKX0sb2EudGV4dD1BbihmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXNwb25zZVRleHR9KSxvYS5qc29uPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIENuKG4sImFwcGxpY2F0aW9uL2pzb24iLGlhLHQpfSxvYS5odG1sPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIENuKG4sInRleHQvaHRtbCIsYWEsdCl9LG9hLnhtbD1BbihmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXNwb25zZVhNTH0pLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/KHRoaXMuZDM9b2EsZGVmaW5lKG9hKSk6Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPW9hOnRoaXMuZDM9b2F9KCk7"></script>
<script src="data:application/javascript;charset=utf-8;base64,KGZ1bmN0aW9uKCl7dmFyIHJhbmQsdW1kLHNsaWNlPVtdLnNsaWNlO3JhbmQ9ZnVuY3Rpb24oKXtyZXR1cm4oTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikrIjAwMDAwMDAwMDAwMDAwMDAwIikucmVwbGFjZSgvW15hLXpdKy9nLCIiKS5zbGljZSgwLDUpfTt1bWQ9ZnVuY3Rpb24oZmFjdG9yeSl7aWYodHlwZW9mIGV4cG9ydHM9PT0ib2JqZWN0Iil7cmV0dXJuIG1vZHVsZS5leHBvcnRzPWZhY3RvcnkoKX1lbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKXtyZXR1cm4gZGVmaW5lKFtdLGZhY3RvcnkpfWVsc2V7cmV0dXJuIHRoaXMudGV4dHVyZXM9ZmFjdG9yeSgpfX07dW1kKGZ1bmN0aW9uKCl7cmV0dXJue2NpcmNsZXM6ZnVuY3Rpb24oKXt2YXIgYmFja2dyb3VuZCxjaXJjbGVzLGNvbXBsZW1lbnQsZmlsbCxpZCxyYWRpdXMsc2l6ZSxzdHJva2Usc3Ryb2tlV2lkdGg7c2l6ZT0yMDtiYWNrZ3JvdW5kPSIiO3JhZGl1cz0yO2NvbXBsZW1lbnQ9ZmFsc2U7ZmlsbD0iIzM0MzQzNCI7c3Ryb2tlPSIjMzQzNDM0IjtzdHJva2VXaWR0aD0wO2lkPXJhbmQoKTtjaXJjbGVzPWZ1bmN0aW9uKCl7dmFyIGNvcm5lcixnLGksbGVuLHJlZixyZXN1bHRzO2c9dGhpcy5hcHBlbmQoImRlZnMiKS5hcHBlbmQoInBhdHRlcm4iKS5hdHRyKHtpZDppZCxwYXR0ZXJuVW5pdHM6InVzZXJTcGFjZU9uVXNlIix3aWR0aDpzaXplLGhlaWdodDpzaXplfSk7aWYoYmFja2dyb3VuZCl7Zy5hcHBlbmQoInJlY3QiKS5hdHRyKHt3aWR0aDpzaXplLGhlaWdodDpzaXplLGZpbGw6YmFja2dyb3VuZH0pfWcuYXBwZW5kKCJjaXJjbGUiKS5hdHRyKHtjeDpzaXplLzIsY3k6c2l6ZS8yLHI6cmFkaXVzLGZpbGw6ZmlsbCxzdHJva2U6c3Ryb2tlLCJzdHJva2Utd2lkdGgiOnN0cm9rZVdpZHRofSk7aWYoY29tcGxlbWVudCl7cmVmPVtbMCwwXSxbMCxzaXplXSxbc2l6ZSwwXSxbc2l6ZSxzaXplXV07cmVzdWx0cz1bXTtmb3IoaT0wLGxlbj1yZWYubGVuZ3RoO2k8bGVuO2krKyl7Y29ybmVyPXJlZltpXTtyZXN1bHRzLnB1c2goZy5hcHBlbmQoImNpcmNsZSIpLmF0dHIoe2N4OmNvcm5lclswXSxjeTpjb3JuZXJbMV0scjpyYWRpdXMsZmlsbDpmaWxsLHN0cm9rZTpzdHJva2UsInN0cm9rZS13aWR0aCI6c3Ryb2tlV2lkdGh9KSl9cmV0dXJuIHJlc3VsdHN9fTtjaXJjbGVzLmhlYXZpZXI9ZnVuY3Rpb24oXyl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpe3JhZGl1cz1yYWRpdXMqMn1lbHNle3JhZGl1cz1fP3JhZGl1cyoyKl86cmFkaXVzKjJ9cmV0dXJuIGNpcmNsZXN9O2NpcmNsZXMubGlnaHRlcj1mdW5jdGlvbihfKXtpZighYXJndW1lbnRzLmxlbmd0aCl7cmFkaXVzPXJhZGl1cy8yfWVsc2V7cmFkaXVzPV8/cmFkaXVzLygyKl8pOnJhZGl1cy8yfXJldHVybiBjaXJjbGVzfTtjaXJjbGVzLnRoaW5uZXI9ZnVuY3Rpb24oXyl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpe3NpemU9c2l6ZSoyfWVsc2V7c2l6ZT1fP3NpemUqMipfOnNpemUqMn1yZXR1cm4gY2lyY2xlc307Y2lyY2xlcy50aGlja2VyPWZ1bmN0aW9uKF8pe2lmKCFhcmd1bWVudHMubGVuZ3RoKXtzaXplPXNpemUvMn1lbHNle3NpemU9Xz9zaXplLygyKl8pOnNpemUvMn1yZXR1cm4gY2lyY2xlc307Y2lyY2xlcy5iYWNrZ3JvdW5kPWZ1bmN0aW9uKF8pe2JhY2tncm91bmQ9XztyZXR1cm4gY2lyY2xlc307Y2lyY2xlcy5zaXplPWZ1bmN0aW9uKF8pe3NpemU9XztyZXR1cm4gY2lyY2xlc307Y2lyY2xlcy5jb21wbGVtZW50PWZ1bmN0aW9uKCl7Y29tcGxlbWVudD10cnVlO3JldHVybiBjaXJjbGVzfTtjaXJjbGVzLnJhZGl1cz1mdW5jdGlvbihfKXtyYWRpdXM9XztyZXR1cm4gY2lyY2xlc307Y2lyY2xlcy5maWxsPWZ1bmN0aW9uKF8pe2ZpbGw9XztyZXR1cm4gY2lyY2xlc307Y2lyY2xlcy5zdHJva2U9ZnVuY3Rpb24oXyl7c3Ryb2tlPV87cmV0dXJuIGNpcmNsZXN9O2NpcmNsZXMuc3Ryb2tlV2lkdGg9ZnVuY3Rpb24oXyl7c3Ryb2tlV2lkdGg9XztyZXR1cm4gY2lyY2xlc307Y2lyY2xlcy5pZD1mdW5jdGlvbihfKXtpZighYXJndW1lbnRzLmxlbmd0aCl7cmV0dXJuIGlkfWVsc2V7aWQ9XztyZXR1cm4gY2lyY2xlc319O2NpcmNsZXMudXJsPWZ1bmN0aW9uKCl7cmV0dXJuInVybCgjIitpZCsiKSJ9O3JldHVybiBjaXJjbGVzfSxsaW5lczpmdW5jdGlvbigpe3ZhciBiYWNrZ3JvdW5kLGlkLGxpbmVzLG9yaWVudGF0aW9uLHBhdGgsc2hhcGVSZW5kZXJpbmcsc2l6ZSxzdHJva2Usc3Ryb2tlV2lkdGg7c2l6ZT0yMDtzdHJva2VXaWR0aD0yO3N0cm9rZT0iIzM0MzQzNCI7aWQ9cmFuZCgpO2JhY2tncm91bmQ9IiI7b3JpZW50YXRpb249WyJkaWFnb25hbCJdO3NoYXBlUmVuZGVyaW5nPSJhdXRvIjtwYXRoPWZ1bmN0aW9uKG9yaWVudGF0aW9uKXtzd2l0Y2gob3JpZW50YXRpb24pe2Nhc2UiMC84IjpyZXR1cm4gZnVuY3Rpb24ocyl7cmV0dXJuIk0gIitzLzIrIiwgMCBsIDAsICIrc30oc2l6ZSk7Y2FzZSJ2ZXJ0aWNhbCI6cmV0dXJuIGZ1bmN0aW9uKHMpe3JldHVybiJNICIrcy8yKyIsIDAgbCAwLCAiK3N9KHNpemUpO2Nhc2UiMS84IjpyZXR1cm4gZnVuY3Rpb24ocyl7cmV0dXJuIk0gIitzLzQrIiwwIGwgIitzLzIrIiwiK3MrIiBNICIrLXMvNCsiLDAgbCAiK3MvMisiLCIrcysiXG5NICIrcyozLzQrIiwwIGwgIitzLzIrIiwiK3N9KHNpemUpO2Nhc2UiMi84IjpyZXR1cm4gZnVuY3Rpb24ocyl7cmV0dXJuIk0gMCwiK3MrIiBsICIrcysiLCIrLXMrIiBNICIrLXMvNCsiLCIrcy80KyIgbCAiK3MvMisiLCIrLXMvMisiXG5NICIrMy80KnMrIiwiKzUvNCpzKyIgbCAiK3MvMisiLCIrLXMvMn0oc2l6ZSk7Y2FzZSJkaWFnb25hbCI6cmV0dXJuIGZ1bmN0aW9uKHMpe3JldHVybiJNIDAsIitzKyIgbCAiK3MrIiwiKy1zKyIgTSAiKy1zLzQrIiwiK3MvNCsiIGwgIitzLzIrIiwiKy1zLzIrIlxuTSAiKzMvNCpzKyIsIis1LzQqcysiIGwgIitzLzIrIiwiKy1zLzJ9KHNpemUpO2Nhc2UiMy84IjpyZXR1cm4gZnVuY3Rpb24ocyl7cmV0dXJuIk0gMCwiKzMvNCpzKyIgbCAiK3MrIiwiKy1zLzIrIiBNIDAsIitzLzQrIiBsICIrcysiLCIrLXMvMisiXG5NIDAsIitzKjUvNCsiIGwgIitzKyIsIistcy8yfShzaXplKTtjYXNlIjQvOCI6cmV0dXJuIGZ1bmN0aW9uKHMpe3JldHVybiJNIDAsIitzLzIrIiBsICIrcysiLDAifShzaXplKTtjYXNlImhvcml6b250YWwiOnJldHVybiBmdW5jdGlvbihzKXtyZXR1cm4iTSAwLCIrcy8yKyIgbCAiK3MrIiwwIn0oc2l6ZSk7Y2FzZSI1LzgiOnJldHVybiBmdW5jdGlvbihzKXtyZXR1cm4iTSAwLCIrLXMvNCsiIGwgIitzKyIsIitzLzIrIk0gMCwiK3MvNCsiIGwgIitzKyIsIitzLzIrIlxuTSAwLCIrcyozLzQrIiBsICIrcysiLCIrcy8yfShzaXplKTtjYXNlIjYvOCI6cmV0dXJuIGZ1bmN0aW9uKHMpe3JldHVybiJNIDAsMCBsICIrcysiLCIrcysiIE0gIistcy80KyIsIiszLzQqcysiIGwgIitzLzIrIiwiK3MvMisiXG5NICIrcyozLzQrIiwiKy1zLzQrIiBsICIrcy8yKyIsIitzLzJ9KHNpemUpO2Nhc2UiNy84IjpyZXR1cm4gZnVuY3Rpb24ocyl7cmV0dXJuIk0gIistcy80KyIsMCBsICIrcy8yKyIsIitzKyIgTSAiK3MvNCsiLDAgbCAiK3MvMisiLCIrcysiXG5NICIrcyozLzQrIiwwIGwgIitzLzIrIiwiK3N9KHNpemUpO2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKHMpe3JldHVybiJNICIrcy8yKyIsIDAgbCAwLCAiK3N9KHNpemUpfX07bGluZXM9ZnVuY3Rpb24oKXt2YXIgZyxpLGxlbixvLHJlc3VsdHM7Zz10aGlzLmFwcGVuZCgiZGVmcyIpLmFwcGVuZCgicGF0dGVybiIpLmF0dHIoe2lkOmlkLHBhdHRlcm5Vbml0czoidXNlclNwYWNlT25Vc2UiLHdpZHRoOnNpemUsaGVpZ2h0OnNpemV9KTtpZihiYWNrZ3JvdW5kKXtnLmFwcGVuZCgicmVjdCIpLmF0dHIoe3dpZHRoOnNpemUsaGVpZ2h0OnNpemUsZmlsbDpiYWNrZ3JvdW5kfSl9cmVzdWx0cz1bXTtmb3IoaT0wLGxlbj1vcmllbnRhdGlvbi5sZW5ndGg7aTxsZW47aSsrKXtvPW9yaWVudGF0aW9uW2ldO3Jlc3VsdHMucHVzaChnLmFwcGVuZCgicGF0aCIpLmF0dHIoe2Q6cGF0aChvKSwic3Ryb2tlLXdpZHRoIjpzdHJva2VXaWR0aCwic2hhcGUtcmVuZGVyaW5nIjpzaGFwZVJlbmRlcmluZyxzdHJva2U6c3Ryb2tlLCJzdHJva2UtbGluZWNhcCI6InNxdWFyZSJ9KSl9cmV0dXJuIHJlc3VsdHN9O2xpbmVzLmJhY2tncm91bmQ9ZnVuY3Rpb24oXyl7YmFja2dyb3VuZD1fO3JldHVybiBsaW5lc307bGluZXMuc2hhcGVSZW5kZXJpbmc9ZnVuY3Rpb24oXyl7c2hhcGVSZW5kZXJpbmc9XztyZXR1cm4gbGluZXN9O2xpbmVzLmhlYXZpZXI9ZnVuY3Rpb24oXyl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpe3N0cm9rZVdpZHRoPXN0cm9rZVdpZHRoKjJ9ZWxzZXtzdHJva2VXaWR0aD1fP3N0cm9rZVdpZHRoKjIqXzpzdHJva2VXaWR0aCoyfXJldHVybiBsaW5lc307bGluZXMubGlnaHRlcj1mdW5jdGlvbihfKXtpZighYXJndW1lbnRzLmxlbmd0aCl7c3Ryb2tlV2lkdGg9c3Ryb2tlV2lkdGgvMn1lbHNle3N0cm9rZVdpZHRoPV8/c3Ryb2tlV2lkdGgvKDIqXyk6c3Ryb2tlV2lkdGgvMn1yZXR1cm4gbGluZXN9O2xpbmVzLnRoaW5uZXI9ZnVuY3Rpb24oXyl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpe3NpemU9c2l6ZSoyfWVsc2V7c2l6ZT1fP3NpemUqMipfOnNpemUqMn1yZXR1cm4gbGluZXN9O2xpbmVzLnRoaWNrZXI9ZnVuY3Rpb24oXyl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpe3NpemU9c2l6ZS8yfWVsc2V7c2l6ZT1fP3NpemUvKDIqXyk6c2l6ZS8yfXJldHVybiBsaW5lc307bGluZXMub3JpZW50YXRpb249ZnVuY3Rpb24oKXt2YXIgYXJnczthcmdzPTE8PWFyZ3VtZW50cy5sZW5ndGg/c2xpY2UuY2FsbChhcmd1bWVudHMsMCk6W107b3JpZW50YXRpb249YXJncztyZXR1cm4gbGluZXN9O2xpbmVzLnNpemU9ZnVuY3Rpb24oXyl7c2l6ZT1fO3JldHVybiBsaW5lc307bGluZXMuc3Ryb2tlPWZ1bmN0aW9uKF8pe3N0cm9rZT1fO3JldHVybiBsaW5lc307bGluZXMuc3Ryb2tlV2lkdGg9ZnVuY3Rpb24oXyl7c3Ryb2tlV2lkdGg9XztyZXR1cm4gbGluZXN9O2xpbmVzLmlkPWZ1bmN0aW9uKF8pe2lmKCFhcmd1bWVudHMubGVuZ3RoKXtyZXR1cm4gaWR9ZWxzZXtpZD1fO3JldHVybiBsaW5lc319O2xpbmVzLnVybD1mdW5jdGlvbigpe3JldHVybiJ1cmwoIyIraWQrIikifTtyZXR1cm4gbGluZXN9LHBhdGhzOmZ1bmN0aW9uKCl7dmFyIGJhY2tncm91bmQsZCxmaWxsLGhlaWdodCxpZCxwYXRocyxzaGFwZVJlbmRlcmluZyxzaXplLHN0cm9rZSxzdHJva2VXaWR0aCxzdmdQYXRoLHdpZHRoO3NpemU9MjA7aGVpZ2h0PTE7d2lkdGg9MTtzdHJva2VXaWR0aD0yO3N0cm9rZT0iIzM0MzQzNCI7YmFja2dyb3VuZD0iIjtkPSIiO3NoYXBlUmVuZGVyaW5nPSJhdXRvIjtmaWxsPSJ0cmFuc3BhcmVudCI7aWQ9dm9pZCAwO3N2Z1BhdGg9ZnVuY3Rpb24oXyl7c3dpdGNoKF8pe2Nhc2Uic3F1YXJlcyI6cmV0dXJuIGZ1bmN0aW9uKHMpe3JldHVybiJNICIrcy80KyIgIitzLzQrIiBsICIrcy8yKyIgMCBsIDAgIitzLzIrIiBsICIrLXMvMisiIDAgWiJ9KHNpemUpO2Nhc2Uibnlsb24iOnJldHVybiBmdW5jdGlvbihzKXtyZXR1cm4iTSAwICIrcy80KyIgbCAiK3MvNCsiIDAgbCAwICIrLXMvNCsiIE0gIitzKjMvNCsiICIrcysiIGwgMCAiKy1zLzQrIlxubCAiK3MvNCsiIDAgTSAiK3MvNCsiICIrcy8yKyIgbCAwICIrcy80KyIgbCAiK3MvNCsiIDAgTSAiK3MvMisiICIrcy80KyJcbmwgIitzLzQrIiAwIGwgMCAiK3MvNH0oc2l6ZSk7Y2FzZSJ3YXZlcyI6cmV0dXJuIGZ1bmN0aW9uKHMpe3JldHVybiJNIDAgIitzLzIrIiBjICIrcy84KyIgIistcy80KyIgLCAiK3MqMy84KyIgIistcy80KyIgLCAiK3MvMisiIDBcbmMgIitzLzgrIiAiK3MvNCsiICwgIitzKjMvOCsiICIrcy80KyIgLCAiK3MvMisiIDAgTSAiKy1zLzIrIiAiK3MvMisiXG5jICIrcy84KyIgIitzLzQrIiAsICIrcyozLzgrIiAiK3MvNCsiICwgIitzLzIrIiAwIE0gIitzKyIgIitzLzIrIlxuYyAiK3MvOCsiICIrLXMvNCsiICwgIitzKjMvOCsiICIrLXMvNCsiICwgIitzLzIrIiAwIn0oc2l6ZSk7Y2FzZSJ3b3ZlbiI6cmV0dXJuIGZ1bmN0aW9uKHMpe3JldHVybiJNICIrcy80KyIsIitzLzQrImwiK3MvMisiLCIrcy8yKyJNIitzKjMvNCsiLCIrcy80KyJsIitzLzIrIiwiKy1zLzIrIlxuTSIrcy80KyIsIitzKjMvNCsibCIrLXMvMisiLCIrcy8yKyJNIitzKjMvNCsiLCIrcyo1LzQrImwiK3MvMisiLCIrLXMvMisiXG5NIistcy80KyIsIitzLzQrImwiK3MvMisiLCIrLXMvMn0oc2l6ZSk7Y2FzZSJjcm9zc2VzIjpyZXR1cm4gZnVuY3Rpb24ocyl7cmV0dXJuIk0gIitzLzQrIiwiK3MvNCsibCIrcy8yKyIsIitzLzIrIk0iK3MvNCsiLCIrcyozLzQrImwiK3MvMisiLCIrLXMvMn0oc2l6ZSk7Y2FzZSJjYXBzIjpyZXR1cm4gZnVuY3Rpb24ocyl7cmV0dXJuIk0gIitzLzQrIiwiK3MqMy80KyJsIitzLzQrIiwiKy1zLzIrImwiK3MvNCsiLCIrcy8yfShzaXplKTtjYXNlImhleGFnb25zIjpyZXR1cm4gZnVuY3Rpb24ocyl7d2lkdGg9MztoZWlnaHQ9TWF0aC5zcXJ0KDMpO3JldHVybiJNICIrcysiLDAgbCAiK3MrIiwwIGwgIitzLzIrIiwiK3MqTWF0aC5zcXJ0KDMpLzIrIlxubCAiKy1zLzIrIiwiK3MqTWF0aC5zcXJ0KDMpLzIrIiBsICIrLXMrIiwwXG5sICIrLXMvMisiLCIrLXMqTWF0aC5zcXJ0KDMpLzIrIiBaIE0gMCwiK3MqTWF0aC5zcXJ0KDMpLzIrIlxubCAiK3MvMisiLDAgTSAiKzMqcysiLCIrcypNYXRoLnNxcnQoMykvMisiIGwgIistcy8yKyIsMCJ9KHNpemUpO2RlZmF1bHQ6cmV0dXJuIF8oc2l6ZSl9fTtwYXRocz1mdW5jdGlvbigpe3ZhciBnLHBhdGg7cGF0aD1zdmdQYXRoKGQpO2lkPXJhbmQoKTtnPXRoaXMuYXBwZW5kKCJkZWZzIikuYXBwZW5kKCJwYXR0ZXJuIikuYXR0cih7aWQ6aWQscGF0dGVyblVuaXRzOiJ1c2VyU3BhY2VPblVzZSIsd2lkdGg6c2l6ZSp3aWR0aCxoZWlnaHQ6c2l6ZSpoZWlnaHR9KTtpZihiYWNrZ3JvdW5kKXtnLmFwcGVuZCgicmVjdCIpLmF0dHIoe3dpZHRoOnNpemUqd2lkdGgsaGVpZ2h0OnNpemUqaGVpZ2h0LGZpbGw6YmFja2dyb3VuZH0pfXJldHVybiBnLmFwcGVuZCgicGF0aCIpLmF0dHIoe2Q6cGF0aCxmaWxsOmZpbGwsInN0cm9rZS13aWR0aCI6c3Ryb2tlV2lkdGgsInNoYXBlLXJlbmRlcmluZyI6c2hhcGVSZW5kZXJpbmcsc3Ryb2tlOnN0cm9rZSwic3Ryb2tlLWxpbmVjYXAiOiJzcXVhcmUifSl9O3BhdGhzLmJhY2tncm91bmQ9ZnVuY3Rpb24oXyl7YmFja2dyb3VuZD1fO3JldHVybiBwYXRoc307cGF0aHMuc2hhcGVSZW5kZXJpbmc9ZnVuY3Rpb24oXyl7c2hhcGVSZW5kZXJpbmc9XztyZXR1cm4gcGF0aHN9O3BhdGhzLmhlYXZpZXI9ZnVuY3Rpb24oXyl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpe3N0cm9rZVdpZHRoPXN0cm9rZVdpZHRoKjJ9ZWxzZXtzdHJva2VXaWR0aD1fP3N0cm9rZVdpZHRoKjIqXzpzdHJva2VXaWR0aCoyfXJldHVybiBwYXRoc307cGF0aHMubGlnaHRlcj1mdW5jdGlvbihfKXtpZighYXJndW1lbnRzLmxlbmd0aCl7c3Ryb2tlV2lkdGg9c3Ryb2tlV2lkdGgvMn1lbHNle3N0cm9rZVdpZHRoPV8/c3Ryb2tlV2lkdGgvKDIqXyk6c3Ryb2tlV2lkdGgvMn1yZXR1cm4gcGF0aHN9O3BhdGhzLnRoaW5uZXI9ZnVuY3Rpb24oXyl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpe3NpemU9c2l6ZSoyfWVsc2V7c2l6ZT1fP3NpemUqMipfOnNpemUqMn1yZXR1cm4gcGF0aHN9O3BhdGhzLnRoaWNrZXI9ZnVuY3Rpb24oXyl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpe3NpemU9c2l6ZS8yfWVsc2V7c2l6ZT1fP3NpemUvKDIqXyk6c2l6ZS8yfXJldHVybiBwYXRoc307cGF0aHMuZD1mdW5jdGlvbihfKXtkPV87cmV0dXJuIHBhdGhzfTtwYXRocy5zaXplPWZ1bmN0aW9uKF8pe3NpemU9XztyZXR1cm4gcGF0aHN9O3BhdGhzLnN0cm9rZT1mdW5jdGlvbihfKXtzdHJva2U9XztyZXR1cm4gcGF0aHN9O3BhdGhzLnN0cm9rZVdpZHRoPWZ1bmN0aW9uKF8pe3N0cm9rZVdpZHRoPV87cmV0dXJuIHBhdGhzfTtwYXRocy5pZD1mdW5jdGlvbihfKXtpZighYXJndW1lbnRzLmxlbmd0aCl7cmV0dXJuIGlkfWVsc2V7aWQ9XztyZXR1cm4gcGF0aHN9fTtwYXRocy51cmw9ZnVuY3Rpb24oKXtyZXR1cm4idXJsKCMiK2lkKyIpIn07cmV0dXJuIHBhdGhzfX19KX0pLmNhbGwodGhpcyk7"></script>
</head>
<body style="background-color:white;">
<?xml version="1.0" encoding="UTF-8" ?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1008.00 720.00">
<defs>
<style type="text/css">
line, polyline, path, rect, circle {
fill: none;
stroke: #000000;
stroke-linecap: round;
stroke-linejoin: round;
stroke-miterlimit: 10.00;
}
</style>
</defs>
<rect width="100%" height="100%" style="stroke: none; fill: #FFFFFF;"></rect>
<polyline points="0.00,720.00 0.00,0.00 1008.00,0.00 1008.00,720.00 " style="stroke-width: 1.07; stroke: #FFFFFF; fill: #FFFFFF;"></polyline>
<polyline points="72.71,661.71 72.71,8.97 858.46,8.97 858.46,661.71 " style="stroke-width: 1.07; stroke: none; fill: #FFFFFF;"></polyline>
<polyline points="72.71,632.04 858.46,632.04 " style="stroke-width: 1.07; stroke: #CCCCCC; stroke-linecap: butt;"></polyline>
<polyline points="72.71,483.69 858.46,483.69 " style="stroke-width: 1.07; stroke: #CCCCCC; stroke-linecap: butt;"></polyline>
<polyline points="72.71,335.34 858.46,335.34 " style="stroke-width: 1.07; stroke: #CCCCCC; stroke-linecap: butt;"></polyline>
<polyline points="72.71,186.99 858.46,186.99 " style="stroke-width: 1.07; stroke: #CCCCCC; stroke-linecap: butt;"></polyline>
<polyline points="72.71,38.64 858.46,38.64 " style="stroke-width: 1.07; stroke: #CCCCCC; stroke-linecap: butt;"></polyline>
<rect x="144.15" y="365.90" width="285.72" height="266.14" style="stroke-width: 1.07; stroke-linecap: butt; fill: #F23C24;"></rect>
<rect x="144.15" y="216.66" width="285.72" height="149.24" style="stroke-width: 1.07; stroke-linecap: butt; fill: #FA4B29;"></rect>
<rect x="144.15" y="101.54" width="285.72" height="115.12" style="stroke-width: 1.07; stroke-linecap: butt; fill: #FD622F;"></rect>
<rect x="501.30" y="311.01" width="285.72" height="321.03" style="stroke-width: 1.07; stroke-linecap: butt; fill: #FEA245;"></rect>
<rect x="501.30" y="246.03" width="285.72" height="64.98" style="stroke-width: 1.07; stroke-linecap: butt; fill: #FEB24C;"></rect>
<rect x="501.30" y="197.07" width="285.72" height="48.96" style="stroke-width: 1.07; stroke-linecap: butt; fill: #FFC35E;"></rect>
<polyline points="72.71,661.71 72.71,8.97 " style="stroke-width: 1.07; stroke-linecap: butt;"></polyline>
<text x="56.64" y="637.19" style="font-size: 14.40pt; font-family: Arial;">0</text>
<text x="40.62" y="488.84" style="font-size: 14.40pt; font-family: Arial;">500</text>
<text x="32.61" y="340.49" style="font-size: 14.40pt; font-family: Arial;">1000</text>
<text x="32.61" y="192.14" style="font-size: 14.40pt; font-family: Arial;">1500</text>
<text x="32.61" y="43.79" style="font-size: 14.40pt; font-family: Arial;">2000</text>
<polyline points="68.23,632.04 72.71,632.04 " style="stroke-width: 1.07; stroke-linecap: butt;"></polyline>
<polyline points="68.23,483.69 72.71,483.69 " style="stroke-width: 1.07; stroke-linecap: butt;"></polyline>
<polyline points="68.23,335.34 72.71,335.34 " style="stroke-width: 1.07; stroke-linecap: butt;"></polyline>
<polyline points="68.23,186.99 72.71,186.99 " style="stroke-width: 1.07; stroke-linecap: butt;"></polyline>
<polyline points="68.23,38.64 72.71,38.64 " style="stroke-width: 1.07; stroke-linecap: butt;"></polyline>
<polyline points="72.71,661.71 858.46,661.71 " style="stroke-width: 1.07; stroke-linecap: butt;"></polyline>
<polyline points="287.01,666.19 287.01,661.71 " style="stroke-width: 1.07; stroke-linecap: butt;"></polyline>
<polyline points="644.16,666.19 644.16,661.71 " style="stroke-width: 1.07; stroke-linecap: butt;"></polyline>
<text transform="translate(292.16,687.39) rotate(-90)" style="font-size: 14.40pt; font-family: Arial;">S1</text>
<text transform="translate(649.32,687.39) rotate(-90)" style="font-size: 14.40pt; font-family: Arial;">S2</text>
<text x="435.07" y="707.45" style="font-size: 18.00pt; font-family: Arial;">Sample</text>
<text transform="translate(25.44,359.35) rotate(-90)" style="font-size: 18.00pt; font-family: Arial;">Count</text>
<rect x="866.96" y="279.28" width="123.57" height="112.11" style="stroke-width: 1.07; stroke: none; fill: #FFFFFF;"></rect>
<image width="17.28" height="86.40" x="871.21" y="300.74" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAABWCAIAAACmUup5AAAABmJLR0QA/wD/AP+gvaeTAAAAo0lEQVRYhd2YyQ3DQAwDddCtpH9XmNTAeRBC/B8MLWm9gvutT5nPuEBVqetrM/JN2sl4BDwb8rBs/+UhPR35zKojnlnAoGyHmc14+rTHHmw1yRZi6iGMXwPiaZKN1AD0FNUtlS01B/6FqgJnDjFDvgeH3+dw3WIelM2+uCFDZieV7TDjL1bHs9nLZbA/JBtg/AUbZntspkOeyzXIzUEkG/kf8gOlqg0CmojySgAAAABJRU5ErkJggg=="></image>
<text x="892.81" y="390.13" style="font-size: 14.40pt; font-family: Arial;">0</text>
<text x="892.81" y="369.61" style="font-size: 14.40pt; font-family: Arial;">5</text>
<text x="892.81" y="349.09" style="font-size: 14.40pt; font-family: Arial;">10</text>
<text x="892.81" y="328.57" style="font-size: 14.40pt; font-family: Arial;">15</text>
<text x="892.81" y="308.05" style="font-size: 14.40pt; font-family: Arial;">20</text>
<text x="871.21" y="296.42" style="font-size: 18.00pt; font-family: Arial;">-log10(qvalue)</text>
<line x1="871.21" y1="384.98" x2="874.67" y2="384.98" style="stroke-width: 0.38; stroke: #FFFFFF; stroke-linecap: butt;"></line>
<line x1="871.21" y1="364.46" x2="874.67" y2="364.46" style="stroke-width: 0.38; stroke: #FFFFFF; stroke-linecap: butt;"></line>
<line x1="871.21" y1="343.94" x2="874.67" y2="343.94" style="stroke-width: 0.38; stroke: #FFFFFF; stroke-linecap: butt;"></line>
<line x1="871.21" y1="323.42" x2="874.67" y2="323.42" style="stroke-width: 0.38; stroke: #FFFFFF; stroke-linecap: butt;"></line>
<line x1="871.21" y1="302.90" x2="874.67" y2="302.90" style="stroke-width: 0.38; stroke: #FFFFFF; stroke-linecap: butt;"></line>
<line x1="885.04" y1="384.98" x2="888.49" y2="384.98" style="stroke-width: 0.38; stroke: #FFFFFF; stroke-linecap: butt;"></line>
<line x1="885.04" y1="364.46" x2="888.49" y2="364.46" style="stroke-width: 0.38; stroke: #FFFFFF; stroke-linecap: butt;"></line>
<line x1="885.04" y1="343.94" x2="888.49" y2="343.94" style="stroke-width: 0.38; stroke: #FFFFFF; stroke-linecap: butt;"></line>
<line x1="885.04" y1="323.42" x2="888.49" y2="323.42" style="stroke-width: 0.38; stroke: #FFFFFF; stroke-linecap: butt;"></line>
<line x1="885.04" y1="302.90" x2="888.49" y2="302.90" style="stroke-width: 0.38; stroke: #FFFFFF; stroke-linecap: butt;"></line>
</svg>
<script>
var data = [{"Sample":"S1","qvalue":14.7043,"type":"A","value":897},{"Sample":"S2","qvalue":8.1683,"type":"A","value":1082},{"Sample":"S1","qvalue":13.5472,"type":"overlap","value":503},{"Sample":"S2","qvalue":6.7116,"type":"overlap","value":219},{"Sample":"S1","qvalue":12.3901,"type":"B","value":388},{"Sample":"S2","qvalue":5.2549,"type":"B","value":165}]
var svg = d3.select('svg');
svg.select('style').remove();
var bars = svg.selectAll('rect:not(:last-of-type):not(:first-of-type)')
.data(d3.merge(d3.values(d3.nest().key(function(d){return d.Sample}).map(data))))
bars.style('fill',function(d){
var t = textures
.lines()
.background(d3.rgb(d3.select(this).style('fill')).toString());
if(d.type === 'A') t.orientation('2/8');
if(d.type === 'overlap') t.orientation('2/8','6/8');
if(d.type === 'B') t.orientation('6/8');
svg.call(t);
return t.url();
});
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment