Eldarya Enhancements

Enhances the user experience of Eldarya.

Από την 15/05/2021. Δείτε την τελευταία έκδοση.

// ==UserScript==
// @name         Eldarya Enhancements
// @namespace    https://gitlab.com/NatoBoram/eldarya-enhancements
// @license      GPL-3.0-or-later
// @version      0.0.14
// @author       Nato Boram
// @description  Enhances the user experience of Eldarya.
// @icon         https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/avatar.png
// @supportURL   https://gitlab.com/NatoBoram/Eldarya-Face-Downloader/issues
//
// @match        https://www.eldarya.com.br/*
// @match        https://www.eldarya.de/*
// @match        https://www.eldarya.es/*
// @match        https://www.eldarya.hu/*
// @match        https://www.eldarya.it/*
// @match        https://www.eldarya.pl/*
// @match        https://www.eldarya.ru/*
// @match        https://www.eldarya.com/*
// @match        https://www.eldarya.fr/*
//
// @grant        none
// ==/UserScript==
/******/ (() => { // webpackBootstrap
/******/ 	var __webpack_modules__ = ({

/***/ "./node_modules/hogan.js/lib/compiler.js":
/*!***********************************************!*\
  !*** ./node_modules/hogan.js/lib/compiler.js ***!
  \***********************************************/
/***/ ((__unused_webpack_module, exports) => {

/*
 *  Copyright 2011 Twitter, Inc.
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

(function (Hogan) {
  // Setup regex  assignments
  // remove whitespace according to Mustache spec
  var rIsWhitespace = /\S/,
      rQuot = /\"/g,
      rNewline =  /\n/g,
      rCr = /\r/g,
      rSlash = /\\/g,
      rLineSep = /\u2028/,
      rParagraphSep = /\u2029/;

  Hogan.tags = {
    '#': 1, '^': 2, '<': 3, '$': 4,
    '/': 5, '!': 6, '>': 7, '=': 8, '_v': 9,
    '{': 10, '&': 11, '_t': 12
  };

  Hogan.scan = function scan(text, delimiters) {
    var len = text.length,
        IN_TEXT = 0,
        IN_TAG_TYPE = 1,
        IN_TAG = 2,
        state = IN_TEXT,
        tagType = null,
        tag = null,
        buf = '',
        tokens = [],
        seenTag = false,
        i = 0,
        lineStart = 0,
        otag = '{{',
        ctag = '}}';

    function addBuf() {
      if (buf.length > 0) {
        tokens.push({tag: '_t', text: new String(buf)});
        buf = '';
      }
    }

    function lineIsWhitespace() {
      var isAllWhitespace = true;
      for (var j = lineStart; j < tokens.length; j++) {
        isAllWhitespace =
          (Hogan.tags[tokens[j].tag] < Hogan.tags['_v']) ||
          (tokens[j].tag == '_t' && tokens[j].text.match(rIsWhitespace) === null);
        if (!isAllWhitespace) {
          return false;
        }
      }

      return isAllWhitespace;
    }

    function filterLine(haveSeenTag, noNewLine) {
      addBuf();

      if (haveSeenTag && lineIsWhitespace()) {
        for (var j = lineStart, next; j < tokens.length; j++) {
          if (tokens[j].text) {
            if ((next = tokens[j+1]) && next.tag == '>') {
              // set indent to token value
              next.indent = tokens[j].text.toString()
            }
            tokens.splice(j, 1);
          }
        }
      } else if (!noNewLine) {
        tokens.push({tag:'\n'});
      }

      seenTag = false;
      lineStart = tokens.length;
    }

    function changeDelimiters(text, index) {
      var close = '=' + ctag,
          closeIndex = text.indexOf(close, index),
          delimiters = trim(
            text.substring(text.indexOf('=', index) + 1, closeIndex)
          ).split(' ');

      otag = delimiters[0];
      ctag = delimiters[delimiters.length - 1];

      return closeIndex + close.length - 1;
    }

    if (delimiters) {
      delimiters = delimiters.split(' ');
      otag = delimiters[0];
      ctag = delimiters[1];
    }

    for (i = 0; i < len; i++) {
      if (state == IN_TEXT) {
        if (tagChange(otag, text, i)) {
          --i;
          addBuf();
          state = IN_TAG_TYPE;
        } else {
          if (text.charAt(i) == '\n') {
            filterLine(seenTag);
          } else {
            buf += text.charAt(i);
          }
        }
      } else if (state == IN_TAG_TYPE) {
        i += otag.length - 1;
        tag = Hogan.tags[text.charAt(i + 1)];
        tagType = tag ? text.charAt(i + 1) : '_v';
        if (tagType == '=') {
          i = changeDelimiters(text, i);
          state = IN_TEXT;
        } else {
          if (tag) {
            i++;
          }
          state = IN_TAG;
        }
        seenTag = i;
      } else {
        if (tagChange(ctag, text, i)) {
          tokens.push({tag: tagType, n: trim(buf), otag: otag, ctag: ctag,
                       i: (tagType == '/') ? seenTag - otag.length : i + ctag.length});
          buf = '';
          i += ctag.length - 1;
          state = IN_TEXT;
          if (tagType == '{') {
            if (ctag == '}}') {
              i++;
            } else {
              cleanTripleStache(tokens[tokens.length - 1]);
            }
          }
        } else {
          buf += text.charAt(i);
        }
      }
    }

    filterLine(seenTag, true);

    return tokens;
  }

  function cleanTripleStache(token) {
    if (token.n.substr(token.n.length - 1) === '}') {
      token.n = token.n.substring(0, token.n.length - 1);
    }
  }

  function trim(s) {
    if (s.trim) {
      return s.trim();
    }

    return s.replace(/^\s*|\s*$/g, '');
  }

  function tagChange(tag, text, index) {
    if (text.charAt(index) != tag.charAt(0)) {
      return false;
    }

    for (var i = 1, l = tag.length; i < l; i++) {
      if (text.charAt(index + i) != tag.charAt(i)) {
        return false;
      }
    }

    return true;
  }

  // the tags allowed inside super templates
  var allowedInSuper = {'_t': true, '\n': true, '$': true, '/': true};

  function buildTree(tokens, kind, stack, customTags) {
    var instructions = [],
        opener = null,
        tail = null,
        token = null;

    tail = stack[stack.length - 1];

    while (tokens.length > 0) {
      token = tokens.shift();

      if (tail && tail.tag == '<' && !(token.tag in allowedInSuper)) {
        throw new Error('Illegal content in < super tag.');
      }

      if (Hogan.tags[token.tag] <= Hogan.tags['$'] || isOpener(token, customTags)) {
        stack.push(token);
        token.nodes = buildTree(tokens, token.tag, stack, customTags);
      } else if (token.tag == '/') {
        if (stack.length === 0) {
          throw new Error('Closing tag without opener: /' + token.n);
        }
        opener = stack.pop();
        if (token.n != opener.n && !isCloser(token.n, opener.n, customTags)) {
          throw new Error('Nesting error: ' + opener.n + ' vs. ' + token.n);
        }
        opener.end = token.i;
        return instructions;
      } else if (token.tag == '\n') {
        token.last = (tokens.length == 0) || (tokens[0].tag == '\n');
      }

      instructions.push(token);
    }

    if (stack.length > 0) {
      throw new Error('missing closing tag: ' + stack.pop().n);
    }

    return instructions;
  }

  function isOpener(token, tags) {
    for (var i = 0, l = tags.length; i < l; i++) {
      if (tags[i].o == token.n) {
        token.tag = '#';
        return true;
      }
    }
  }

  function isCloser(close, open, tags) {
    for (var i = 0, l = tags.length; i < l; i++) {
      if (tags[i].c == close && tags[i].o == open) {
        return true;
      }
    }
  }

  function stringifySubstitutions(obj) {
    var items = [];
    for (var key in obj) {
      items.push('"' + esc(key) + '": function(c,p,t,i) {' + obj[key] + '}');
    }
    return "{ " + items.join(",") + " }";
  }

  function stringifyPartials(codeObj) {
    var partials = [];
    for (var key in codeObj.partials) {
      partials.push('"' + esc(key) + '":{name:"' + esc(codeObj.partials[key].name) + '", ' + stringifyPartials(codeObj.partials[key]) + "}");
    }
    return "partials: {" + partials.join(",") + "}, subs: " + stringifySubstitutions(codeObj.subs);
  }

  Hogan.stringify = function(codeObj, text, options) {
    return "{code: function (c,p,i) { " + Hogan.wrapMain(codeObj.code) + " }," + stringifyPartials(codeObj) +  "}";
  }

  var serialNo = 0;
  Hogan.generate = function(tree, text, options) {
    serialNo = 0;
    var context = { code: '', subs: {}, partials: {} };
    Hogan.walk(tree, context);

    if (options.asString) {
      return this.stringify(context, text, options);
    }

    return this.makeTemplate(context, text, options);
  }

  Hogan.wrapMain = function(code) {
    return 'var t=this;t.b(i=i||"");' + code + 'return t.fl();';
  }

  Hogan.template = Hogan.Template;

  Hogan.makeTemplate = function(codeObj, text, options) {
    var template = this.makePartials(codeObj);
    template.code = new Function('c', 'p', 'i', this.wrapMain(codeObj.code));
    return new this.template(template, text, this, options);
  }

  Hogan.makePartials = function(codeObj) {
    var key, template = {subs: {}, partials: codeObj.partials, name: codeObj.name};
    for (key in template.partials) {
      template.partials[key] = this.makePartials(template.partials[key]);
    }
    for (key in codeObj.subs) {
      template.subs[key] = new Function('c', 'p', 't', 'i', codeObj.subs[key]);
    }
    return template;
  }

  function esc(s) {
    return s.replace(rSlash, '\\\\')
            .replace(rQuot, '\\\"')
            .replace(rNewline, '\\n')
            .replace(rCr, '\\r')
            .replace(rLineSep, '\\u2028')
            .replace(rParagraphSep, '\\u2029');
  }

  function chooseMethod(s) {
    return (~s.indexOf('.')) ? 'd' : 'f';
  }

  function createPartial(node, context) {
    var prefix = "<" + (context.prefix || "");
    var sym = prefix + node.n + serialNo++;
    context.partials[sym] = {name: node.n, partials: {}};
    context.code += 't.b(t.rp("' +  esc(sym) + '",c,p,"' + (node.indent || '') + '"));';
    return sym;
  }

  Hogan.codegen = {
    '#': function(node, context) {
      context.code += 'if(t.s(t.' + chooseMethod(node.n) + '("' + esc(node.n) + '",c,p,1),' +
                      'c,p,0,' + node.i + ',' + node.end + ',"' + node.otag + " " + node.ctag + '")){' +
                      't.rs(c,p,' + 'function(c,p,t){';
      Hogan.walk(node.nodes, context);
      context.code += '});c.pop();}';
    },

    '^': function(node, context) {
      context.code += 'if(!t.s(t.' + chooseMethod(node.n) + '("' + esc(node.n) + '",c,p,1),c,p,1,0,0,"")){';
      Hogan.walk(node.nodes, context);
      context.code += '};';
    },

    '>': createPartial,
    '<': function(node, context) {
      var ctx = {partials: {}, code: '', subs: {}, inPartial: true};
      Hogan.walk(node.nodes, ctx);
      var template = context.partials[createPartial(node, context)];
      template.subs = ctx.subs;
      template.partials = ctx.partials;
    },

    '$': function(node, context) {
      var ctx = {subs: {}, code: '', partials: context.partials, prefix: node.n};
      Hogan.walk(node.nodes, ctx);
      context.subs[node.n] = ctx.code;
      if (!context.inPartial) {
        context.code += 't.sub("' + esc(node.n) + '",c,p,i);';
      }
    },

    '\n': function(node, context) {
      context.code += write('"\\n"' + (node.last ? '' : ' + i'));
    },

    '_v': function(node, context) {
      context.code += 't.b(t.v(t.' + chooseMethod(node.n) + '("' + esc(node.n) + '",c,p,0)));';
    },

    '_t': function(node, context) {
      context.code += write('"' + esc(node.text) + '"');
    },

    '{': tripleStache,

    '&': tripleStache
  }

  function tripleStache(node, context) {
    context.code += 't.b(t.t(t.' + chooseMethod(node.n) + '("' + esc(node.n) + '",c,p,0)));';
  }

  function write(s) {
    return 't.b(' + s + ');';
  }

  Hogan.walk = function(nodelist, context) {
    var func;
    for (var i = 0, l = nodelist.length; i < l; i++) {
      func = Hogan.codegen[nodelist[i].tag];
      func && func(nodelist[i], context);
    }
    return context;
  }

  Hogan.parse = function(tokens, text, options) {
    options = options || {};
    return buildTree(tokens, '', [], options.sectionTags || []);
  }

  Hogan.cache = {};

  Hogan.cacheKey = function(text, options) {
    return [text, !!options.asString, !!options.disableLambda, options.delimiters, !!options.modelGet].join('||');
  }

  Hogan.compile = function(text, options) {
    options = options || {};
    var key = Hogan.cacheKey(text, options);
    var template = this.cache[key];

    if (template) {
      var partials = template.partials;
      for (var name in partials) {
        delete partials[name].instance;
      }
      return template;
    }

    template = this.generate(this.parse(this.scan(text, options.delimiters), text, options), text, options);
    return this.cache[key] = template;
  }
})( true ? exports : 0);


/***/ }),

/***/ "./node_modules/hogan.js/lib/hogan.js":
/*!********************************************!*\
  !*** ./node_modules/hogan.js/lib/hogan.js ***!
  \********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

/*
 *  Copyright 2011 Twitter, Inc.
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

// This file is for use with Node.js. See dist/ for browser files.

var Hogan = __webpack_require__(/*! ./compiler */ "./node_modules/hogan.js/lib/compiler.js");
Hogan.Template = __webpack_require__(/*! ./template */ "./node_modules/hogan.js/lib/template.js").Template;
Hogan.template = Hogan.Template;
module.exports = Hogan;


/***/ }),

/***/ "./node_modules/hogan.js/lib/template.js":
/*!***********************************************!*\
  !*** ./node_modules/hogan.js/lib/template.js ***!
  \***********************************************/
/***/ ((__unused_webpack_module, exports) => {

/*
 *  Copyright 2011 Twitter, Inc.
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

var Hogan = {};

(function (Hogan) {
  Hogan.Template = function (codeObj, text, compiler, options) {
    codeObj = codeObj || {};
    this.r = codeObj.code || this.r;
    this.c = compiler;
    this.options = options || {};
    this.text = text || '';
    this.partials = codeObj.partials || {};
    this.subs = codeObj.subs || {};
    this.buf = '';
  }

  Hogan.Template.prototype = {
    // render: replaced by generated code.
    r: function (context, partials, indent) { return ''; },

    // variable escaping
    v: hoganEscape,

    // triple stache
    t: coerceToString,

    render: function render(context, partials, indent) {
      return this.ri([context], partials || {}, indent);
    },

    // render internal -- a hook for overrides that catches partials too
    ri: function (context, partials, indent) {
      return this.r(context, partials, indent);
    },

    // ensurePartial
    ep: function(symbol, partials) {
      var partial = this.partials[symbol];

      // check to see that if we've instantiated this partial before
      var template = partials[partial.name];
      if (partial.instance && partial.base == template) {
        return partial.instance;
      }

      if (typeof template == 'string') {
        if (!this.c) {
          throw new Error("No compiler available.");
        }
        template = this.c.compile(template, this.options);
      }

      if (!template) {
        return null;
      }

      // We use this to check whether the partials dictionary has changed
      this.partials[symbol].base = template;

      if (partial.subs) {
        // Make sure we consider parent template now
        if (!partials.stackText) partials.stackText = {};
        for (key in partial.subs) {
          if (!partials.stackText[key]) {
            partials.stackText[key] = (this.activeSub !== undefined && partials.stackText[this.activeSub]) ? partials.stackText[this.activeSub] : this.text;
          }
        }
        template = createSpecializedPartial(template, partial.subs, partial.partials,
          this.stackSubs, this.stackPartials, partials.stackText);
      }
      this.partials[symbol].instance = template;

      return template;
    },

    // tries to find a partial in the current scope and render it
    rp: function(symbol, context, partials, indent) {
      var partial = this.ep(symbol, partials);
      if (!partial) {
        return '';
      }

      return partial.ri(context, partials, indent);
    },

    // render a section
    rs: function(context, partials, section) {
      var tail = context[context.length - 1];

      if (!isArray(tail)) {
        section(context, partials, this);
        return;
      }

      for (var i = 0; i < tail.length; i++) {
        context.push(tail[i]);
        section(context, partials, this);
        context.pop();
      }
    },

    // maybe start a section
    s: function(val, ctx, partials, inverted, start, end, tags) {
      var pass;

      if (isArray(val) && val.length === 0) {
        return false;
      }

      if (typeof val == 'function') {
        val = this.ms(val, ctx, partials, inverted, start, end, tags);
      }

      pass = !!val;

      if (!inverted && pass && ctx) {
        ctx.push((typeof val == 'object') ? val : ctx[ctx.length - 1]);
      }

      return pass;
    },

    // find values with dotted names
    d: function(key, ctx, partials, returnFound) {
      var found,
          names = key.split('.'),
          val = this.f(names[0], ctx, partials, returnFound),
          doModelGet = this.options.modelGet,
          cx = null;

      if (key === '.' && isArray(ctx[ctx.length - 2])) {
        val = ctx[ctx.length - 1];
      } else {
        for (var i = 1; i < names.length; i++) {
          found = findInScope(names[i], val, doModelGet);
          if (found !== undefined) {
            cx = val;
            val = found;
          } else {
            val = '';
          }
        }
      }

      if (returnFound && !val) {
        return false;
      }

      if (!returnFound && typeof val == 'function') {
        ctx.push(cx);
        val = this.mv(val, ctx, partials);
        ctx.pop();
      }

      return val;
    },

    // find values with normal names
    f: function(key, ctx, partials, returnFound) {
      var val = false,
          v = null,
          found = false,
          doModelGet = this.options.modelGet;

      for (var i = ctx.length - 1; i >= 0; i--) {
        v = ctx[i];
        val = findInScope(key, v, doModelGet);
        if (val !== undefined) {
          found = true;
          break;
        }
      }

      if (!found) {
        return (returnFound) ? false : "";
      }

      if (!returnFound && typeof val == 'function') {
        val = this.mv(val, ctx, partials);
      }

      return val;
    },

    // higher order templates
    ls: function(func, cx, partials, text, tags) {
      var oldTags = this.options.delimiters;

      this.options.delimiters = tags;
      this.b(this.ct(coerceToString(func.call(cx, text)), cx, partials));
      this.options.delimiters = oldTags;

      return false;
    },

    // compile text
    ct: function(text, cx, partials) {
      if (this.options.disableLambda) {
        throw new Error('Lambda features disabled.');
      }
      return this.c.compile(text, this.options).render(cx, partials);
    },

    // template result buffering
    b: function(s) { this.buf += s; },

    fl: function() { var r = this.buf; this.buf = ''; return r; },

    // method replace section
    ms: function(func, ctx, partials, inverted, start, end, tags) {
      var textSource,
          cx = ctx[ctx.length - 1],
          result = func.call(cx);

      if (typeof result == 'function') {
        if (inverted) {
          return true;
        } else {
          textSource = (this.activeSub && this.subsText && this.subsText[this.activeSub]) ? this.subsText[this.activeSub] : this.text;
          return this.ls(result, cx, partials, textSource.substring(start, end), tags);
        }
      }

      return result;
    },

    // method replace variable
    mv: function(func, ctx, partials) {
      var cx = ctx[ctx.length - 1];
      var result = func.call(cx);

      if (typeof result == 'function') {
        return this.ct(coerceToString(result.call(cx)), cx, partials);
      }

      return result;
    },

    sub: function(name, context, partials, indent) {
      var f = this.subs[name];
      if (f) {
        this.activeSub = name;
        f(context, partials, this, indent);
        this.activeSub = false;
      }
    }

  };

  //Find a key in an object
  function findInScope(key, scope, doModelGet) {
    var val;

    if (scope && typeof scope == 'object') {

      if (scope[key] !== undefined) {
        val = scope[key];

      // try lookup with get for backbone or similar model data
      } else if (doModelGet && scope.get && typeof scope.get == 'function') {
        val = scope.get(key);
      }
    }

    return val;
  }

  function createSpecializedPartial(instance, subs, partials, stackSubs, stackPartials, stackText) {
    function PartialTemplate() {};
    PartialTemplate.prototype = instance;
    function Substitutions() {};
    Substitutions.prototype = instance.subs;
    var key;
    var partial = new PartialTemplate();
    partial.subs = new Substitutions();
    partial.subsText = {};  //hehe. substext.
    partial.buf = '';

    stackSubs = stackSubs || {};
    partial.stackSubs = stackSubs;
    partial.subsText = stackText;
    for (key in subs) {
      if (!stackSubs[key]) stackSubs[key] = subs[key];
    }
    for (key in stackSubs) {
      partial.subs[key] = stackSubs[key];
    }

    stackPartials = stackPartials || {};
    partial.stackPartials = stackPartials;
    for (key in partials) {
      if (!stackPartials[key]) stackPartials[key] = partials[key];
    }
    for (key in stackPartials) {
      partial.partials[key] = stackPartials[key];
    }

    return partial;
  }

  var rAmp = /&/g,
      rLt = /</g,
      rGt = />/g,
      rApos = /\'/g,
      rQuot = /\"/g,
      hChars = /[&<>\"\']/;

  function coerceToString(val) {
    return String((val === null || val === undefined) ? '' : val);
  }

  function hoganEscape(str) {
    str = coerceToString(str);
    return hChars.test(str) ?
      str
        .replace(rAmp, '&amp;')
        .replace(rLt, '&lt;')
        .replace(rGt, '&gt;')
        .replace(rApos, '&#39;')
        .replace(rQuot, '&quot;') :
      str;
  }

  var isArray = Array.isArray || function(a) {
    return Object.prototype.toString.call(a) === '[object Array]';
  };

})( true ? exports : 0);


/***/ }),

/***/ "./src/templates/html/carousel_news.html":
/*!***********************************************!*\
  !*** ./src/templates/html/carousel_news.html ***!
  \***********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<a id=\"");t.b(t.v(t.f("id",c,p,0)));t.b("\" class=\"carousel-news carousel-ee\" href=\"");t.b(t.v(t.f("href",c,p,0)));t.b("\" ");if(t.s(t.f("href",c,p,1),c,p,0,74,91,"{{ }}")){t.rs(c,p,function(c,p,t){t.b(" target=\"_blank\" ");});c.pop();}t.b(" style=\"background-image: url(");t.b(t.v(t.f("backgroundImage",c,p,0)));t.b(")\"><div><h4>");t.b(t.v(t.f("h4",c,p,0)));t.b("</h4><h5>");t.b(t.v(t.f("h5",c,p,0)));t.b("</h5><p>");t.b(t.v(t.f("p",c,p,0)));t.b("</p></div></a>");return t.fl(); },partials: {}, subs: {  }}, "<a id=\"{{id}}\" class=\"carousel-news carousel-ee\" href=\"{{href}}\" {{#href}} target=\"_blank\" {{/href}} style=\"background-image: url({{backgroundImage}})\"><div><h4>{{h4}}</h4><h5>{{h5}}</h5><p>{{p}}</p></div></a>", H);return T; }();

/***/ }),

/***/ "./src/templates/html/favorites_action.html":
/*!**************************************************!*\
  !*** ./src/templates/html/favorites_action.html ***!
  \**************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<button id=\"");t.b(t.v(t.f("id",c,p,0)));t.b("\" class=\"nl-button favorites-action-ee\"> ");t.b(t.v(t.f("text",c,p,0)));t.b(" </button>");return t.fl(); },partials: {}, subs: {  }}, "<button id=\"{{id}}\" class=\"nl-button favorites-action-ee\"> {{text}} </button>", H);return T; }();

/***/ }),

/***/ "./src/templates/html/home_content_small.html":
/*!****************************************************!*\
  !*** ./src/templates/html/home_content_small.html ***!
  \****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<a class=\"home-content-tile home-content-small home-content-small-ee\" id=\"home-");t.b(t.v(t.f("id",c,p,0)));t.b("\" href=\"");t.b(t.v(t.f("href",c,p,0)));t.b("\" style=\"background-image: url(");t.b(t.v(t.f("backgroundImage",c,p,0)));t.b(");\"><h4>");t.b(t.v(t.f("h4",c,p,0)));t.b("</h4></a>");return t.fl(); },partials: {}, subs: {  }}, "<a class=\"home-content-tile home-content-small home-content-small-ee\" id=\"home-{{id}}\" href=\"{{href}}\" style=\"background-image: url({{backgroundImage}});\"><h4>{{h4}}</h4></a>", H);return T; }();

/***/ }),

/***/ "./src/templates/html/main_menu.html":
/*!*******************************************!*\
  !*** ./src/templates/html/main_menu.html ***!
  \*******************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<li class=\"main-menu-");t.b(t.v(t.f("class",c,p,0)));t.b(" main-menu-ee\"><a href=\"");t.b(t.v(t.f("href",c,p,0)));t.b("\">");t.b(t.v(t.f("text",c,p,0)));t.b("</a></li>");return t.fl(); },partials: {}, subs: {  }}, "<li class=\"main-menu-{{class}} main-menu-ee\"><a href=\"{{href}}\">{{text}}</a></li>", H);return T; }();

/***/ }),

/***/ "./src/templates/html/profile_contact_action.html":
/*!********************************************************!*\
  !*** ./src/templates/html/profile_contact_action.html ***!
  \********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<li id=\"");t.b(t.v(t.f("id",c,p,0)));t.b("\" class=\"profile-contact-action-ee\"><span class=\"nl-button nl-button-sm\"><div class=\"action-description\">");t.b(t.v(t.f("actionDescription",c,p,0)));t.b("</div></span></li>");return t.fl(); },partials: {}, subs: {  }}, "<li id=\"{{id}}\" class=\"profile-contact-action-ee\"><span class=\"nl-button nl-button-sm\"><div class=\"action-description\">{{actionDescription}}</div></span></li>", H);return T; }();

/***/ }),

/***/ "./src/templates/html/settings.html":
/*!******************************************!*\
  !*** ./src/templates/html/settings.html ***!
  \******************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var H = __webpack_require__(/*! hogan.js */ "./node_modules/hogan.js/lib/hogan.js");
module.exports = function() { var T = new H.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("<div class=\"account-misc-bloc account-ee-bloc bloc\"><h2 class=\"section-title\">Enhancements</h2><ul class=\"account-misc-actions\"><li id=\"ee-minigames-enabled\" class=\"nl-button nl-button-sm ");if(t.s(t.f("minigames",c,p,1),c,p,0,202,208,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("active");});c.pop();}t.b("\">Minigames</li><li id=\"ee-explorations-enabled\" class=\"nl-button nl-button-sm ");if(t.s(t.f("explorations",c,p,1),c,p,0,318,324,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("active");});c.pop();}t.b(" disabled\">Explorations</li><li id=\"ee-market-enabled\" class=\"nl-button nl-button-sm ");if(t.s(t.f("market",c,p,1),c,p,0,437,443,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("active");});c.pop();}t.b(" disabled\">Market</li></ul></div>");return t.fl(); },partials: {}, subs: {  }}, "<div class=\"account-misc-bloc account-ee-bloc bloc\"><h2 class=\"section-title\">Enhancements</h2><ul class=\"account-misc-actions\"><li id=\"ee-minigames-enabled\" class=\"nl-button nl-button-sm {{#minigames}}active{{/minigames}}\">Minigames</li><li id=\"ee-explorations-enabled\" class=\"nl-button nl-button-sm {{#explorations}}active{{/explorations}} disabled\">Explorations</li><li id=\"ee-market-enabled\" class=\"nl-button nl-button-sm {{#market}}active{{/market}} disabled\">Market</li></ul></div>", H);return T; }();

/***/ }),

/***/ "./src/appearance/favorites_actions.ts":
/*!*********************************************!*\
  !*** ./src/appearance/favorites_actions.ts ***!
  \*********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "exportPreview": () => (/* binding */ exportPreview),
/* harmony export */   "importOutfit": () => (/* binding */ importOutfit)
/* harmony export */ });
/* harmony import */ var _outfit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../outfit */ "./src/outfit.ts");

function exportPreview() {
    (0,_outfit__WEBPACK_IMPORTED_MODULE_0__.exportOutfit)("#appearance-preview");
}
function importOutfit() {
    const input = document.createElement("input");
    input.setAttribute("type", "file");
    input.setAttribute("accept", "application/json");
    input.click();
    input.addEventListener("input", (event) => {
        if (!event.target)
            return;
        const files = event.target.files;
        if (!files)
            return;
        const file = files[0];
        if (!file)
            return;
        void file.text().then(async (value) => {
            if (!value)
                return;
            const outfit = JSON.parse(value);
            const avatar = Sacha.Avatar.avatars["#appearance-preview"];
            if (!avatar)
                return;
            $.flavrNotif("Importing outfit. Please wait...");
            // Get all categories
            const categories = new Set();
            for (const clothing of outfit) {
                categories.add(clothing.type);
            }
            // Open all categories
            await Promise.all(Array.from(categories.values()).map(async (category) => openCategory(category)));
            // Get all groups
            const groups = new Set();
            for (const clothing of outfit) {
                if (document.querySelector(`[data-group="${clothing.group}"]`))
                    groups.add(clothing.group);
            }
            // Open all groups
            await Promise.all(Array.from(groups.values()).map(async (group) => openGroup(group)));
            // Get the items from `availableItems`
            const wornItems = [];
            outfit.forEach((clothing) => {
                const item = availableItems[clothing.id];
                if (item)
                    wornItems.push(item);
            });
            removeClothes();
            avatar.addItems(wornItems);
            initializeSelectedItems();
            initializeHiddenCategories();
            $.flavrNotif("Imported outfit!");
        });
    });
}
function removeClothes() {
    const avatar = Sacha.Avatar.avatars["#appearance-preview"];
    if (!avatar)
        return;
    for (let i = avatar.children.length - 1; i >= 0; i--) {
        const itemRender = avatar.children[i];
        if (!itemRender)
            continue;
        const item = itemRender.getItem();
        if (Sacha.Avatar.removeItemFromAllAvatars(item)) {
            $(`#appearance-item-${item._id}`).removeClass("selected");
        }
    }
}
async function openGroup(group) {
    return new Promise((resolve) => {
        const categoryContainer = $("#appearance-items-group-" + group.toString());
        if (categoryContainer.hasClass("active")) {
            resolve();
            return;
        }
        if (categoryContainer.length <= 0) {
            void $.get("/player/openGroup/" + group.toString(), function (view) {
                $(view).hide().appendTo("#appearance-items");
            }).always(() => {
                resolve();
            });
        }
        else {
            resolve();
        }
    });
}
async function openCategory(category) {
    return new Promise((resolve) => {
        const categoryContainer = $("#appearance-items-category-" + category);
        if (categoryContainer.hasClass("active")) {
            resolve();
            return;
        }
        if (categoryContainer.length <= 0) {
            void $.post("/player/openCategory/" + category, function (view) {
                $(view).hide().appendTo("#appearance-items");
            }).always(() => {
                resolve();
            });
        }
        else {
            resolve();
        }
    });
}


/***/ }),

/***/ "./src/carousel/carousel_beemoov_annoyances.ts":
/*!*****************************************************!*\
  !*** ./src/carousel/carousel_beemoov_annoyances.ts ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "carouselBeemoovAnnoyances": () => (/* binding */ carouselBeemoovAnnoyances)
/* harmony export */ });
const carouselBeemoovAnnoyances = {
    backgroundImage: "https://cdn.discordapp.com/attachments/161636856482496522/842964236204507216/carousel_beemoov_annoyances.png",
    h4: "Beemoov Annoyances",
    href: "https://gitlab.com/NatoBoram/Beemoov-Annoyances",
    id: "carousel-beemoov-annoyances",
    p: "Block some of Eldarya's annoyances.",
};


/***/ }),

/***/ "./src/carousel/carousel_download_face.ts":
/*!************************************************!*\
  !*** ./src/carousel/carousel_download_face.ts ***!
  \************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "carouselDownloadFace": () => (/* binding */ carouselDownloadFace)
/* harmony export */ });
const carouselDownloadFace = {
    backgroundImage: "https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/carousel_download_face.png",
    id: "carousel-download-face",
    h4: "Download your face!",
    p: "Click here to download your guardian's face.",
};


/***/ }),

/***/ "./src/carousel/carousel_download_guardian.ts":
/*!****************************************************!*\
  !*** ./src/carousel/carousel_download_guardian.ts ***!
  \****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "carouselDownloadGuardian": () => (/* binding */ carouselDownloadGuardian)
/* harmony export */ });
const carouselDownloadGuardian = {
    backgroundImage: "https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/carousel_download_guardian.png",
    id: "carousel-download-guardian",
    h4: "Download your guardian!",
    p: "Click here to download your guardian.",
};


/***/ }),

/***/ "./src/carousel/carousel_eldarya_enhancements.ts":
/*!*******************************************************!*\
  !*** ./src/carousel/carousel_eldarya_enhancements.ts ***!
  \*******************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "carouselEE": () => (/* binding */ carouselEE)
/* harmony export */ });
const carouselEE = {
    backgroundImage: "https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/carousel_eldarya_enhancements.png",
    h4: "Eldarya Enhancements",
    href: "https://gitlab.com/NatoBoram/eldarya-enhancements",
    id: "carousel-eldarya-enhancements",
    p: "Enhances the user experience of Eldarya.",
};


/***/ }),

/***/ "./src/carousel/carousel_takeover.ts":
/*!*******************************************!*\
  !*** ./src/carousel/carousel_takeover.ts ***!
  \*******************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "carouselTakeover": () => (/* binding */ carouselTakeover)
/* harmony export */ });
const carouselTakeover = {
    backgroundImage: "/static/img/alchemy/background.jpg",
    id: "carousel-takeover",
    h4: "Takeover",
    p: "Automatically play minigames.",
};


/***/ }),

/***/ "./src/carousel/carousels.ts":
/*!***********************************!*\
  !*** ./src/carousel/carousels.ts ***!
  \***********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "carousels": () => (/* binding */ carousels)
/* harmony export */ });
/* harmony import */ var _carousel_beemoov_annoyances__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./carousel_beemoov_annoyances */ "./src/carousel/carousel_beemoov_annoyances.ts");
/* harmony import */ var _carousel_download_face__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./carousel_download_face */ "./src/carousel/carousel_download_face.ts");
/* harmony import */ var _carousel_download_guardian__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./carousel_download_guardian */ "./src/carousel/carousel_download_guardian.ts");
/* harmony import */ var _carousel_eldarya_enhancements__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./carousel_eldarya_enhancements */ "./src/carousel/carousel_eldarya_enhancements.ts");
/* harmony import */ var _carousel_takeover__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./carousel_takeover */ "./src/carousel/carousel_takeover.ts");





const carousels = [
    // Intro
    _carousel_eldarya_enhancements__WEBPACK_IMPORTED_MODULE_3__.carouselEE,
    // Features
    _carousel_download_face__WEBPACK_IMPORTED_MODULE_1__.carouselDownloadFace,
    _carousel_download_guardian__WEBPACK_IMPORTED_MODULE_2__.carouselDownloadGuardian,
    _carousel_takeover__WEBPACK_IMPORTED_MODULE_4__.carouselTakeover,
    // Ads
    _carousel_beemoov_annoyances__WEBPACK_IMPORTED_MODULE_0__.carouselBeemoovAnnoyances,
];


/***/ }),

/***/ "./src/download-canvas.ts":
/*!********************************!*\
  !*** ./src/download-canvas.ts ***!
  \********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "downloadFace": () => (/* binding */ downloadFace),
/* harmony export */   "downloadGuardian": () => (/* binding */ downloadGuardian)
/* harmony export */ });
function downloadCanvas(canvas, name) {
    // Make it an image
    const image = canvas.toDataURL("image/png");
    // Create a link
    const a = document.createElement("a");
    a.setAttribute("href", image);
    a.setAttribute("download", `${name}.png`);
    // Place it on the body
    a.style.display = "none";
    document.body.appendChild(a);
    // Start the download
    a.click();
    // Remove the link
    document.body.removeChild(a);
}
function downloadFace() {
    const canvas = document.querySelector("#avatar-menu-container canvas");
    if (!canvas) {
        console.warn("Couldn't find the guardian's face.");
        return;
    }
    downloadCanvas(canvas, "face");
}
function downloadGuardian() {
    const canvas = document.querySelector("#home-avatar-player canvas");
    if (!canvas) {
        console.warn("Couldn't find the guardian.");
        return;
    }
    downloadCanvas(canvas, "guardian");
}


/***/ }),

/***/ "./src/eldarya/jquery.ts":
/*!*******************************!*\
  !*** ./src/eldarya/jquery.ts ***!
  \*******************************/
/***/ (() => {

"use strict";



/***/ }),

/***/ "./src/local_storage/local_storage.enum.ts":
/*!*************************************************!*\
  !*** ./src/local_storage/local_storage.enum.ts ***!
  \*************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "LocalStorageKey": () => (/* binding */ LocalStorageKey)
/* harmony export */ });
var LocalStorageKey;
(function (LocalStorageKey) {
    LocalStorageKey["explorations"] = "explorations";
    LocalStorageKey["favorites"] = "favorites";
    LocalStorageKey["market"] = "market";
    LocalStorageKey["minigames"] = "minigames";
})(LocalStorageKey || (LocalStorageKey = {}));


/***/ }),

/***/ "./src/local_storage/local_storage.ts":
/*!********************************************!*\
  !*** ./src/local_storage/local_storage.ts ***!
  \********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "LocalStorage": () => (/* binding */ LocalStorage)
/* harmony export */ });
/* harmony import */ var _local_storage_enum__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./local_storage.enum */ "./src/local_storage/local_storage.enum.ts");

class LocalStorage {
    static get explorations() {
        return this.getBoolean(_local_storage_enum__WEBPACK_IMPORTED_MODULE_0__.LocalStorageKey.explorations, false);
    }
    static set explorations(enabled) {
        this.setItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_0__.LocalStorageKey.explorations, enabled);
    }
    static get favorites() {
        const json = this.localStorage.getItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_0__.LocalStorageKey.favorites);
        const outfits = json != null ? JSON.parse(json) : [];
        return outfits;
    }
    static set favorites(clothes) {
        this.setItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_0__.LocalStorageKey.favorites, clothes);
    }
    static get market() {
        return this.getBoolean(_local_storage_enum__WEBPACK_IMPORTED_MODULE_0__.LocalStorageKey.market, false);
    }
    static set market(enabled) {
        this.setItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_0__.LocalStorageKey.market, enabled);
    }
    static get minigames() {
        return this.getBoolean(_local_storage_enum__WEBPACK_IMPORTED_MODULE_0__.LocalStorageKey.minigames, false);
    }
    static set minigames(enabled) {
        this.setItem(_local_storage_enum__WEBPACK_IMPORTED_MODULE_0__.LocalStorageKey.minigames, enabled);
    }
    static get settings() {
        return {
            explorations: this.explorations,
            market: this.market,
            minigames: this.minigames,
        };
    }
    static getBoolean(key, fallback) {
        return Boolean(JSON.parse(this.localStorage.getItem(key) ?? JSON.stringify(fallback)));
    }
    static setItem(key, value) {
        this.localStorage.setItem(key, JSON.stringify(value));
    }
}
LocalStorage.localStorage = localStorage;


/***/ }),

/***/ "./src/minigames/emile.ts":
/*!********************************!*\
  !*** ./src/minigames/emile.ts ***!
  \********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "playPeggle": () => (/* binding */ playPeggle),
/* harmony export */   "playFlappy": () => (/* binding */ playFlappy),
/* harmony export */   "playHatchlings": () => (/* binding */ playHatchlings)
/* harmony export */ });
/* harmony import */ var _eldarya_jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../eldarya/jquery */ "./src/eldarya/jquery.ts");
/* harmony import */ var _eldarya_jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_eldarya_jquery__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _flappy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./flappy */ "./src/minigames/flappy.ts");
/* harmony import */ var _hatchlings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./hatchlings */ "./src/minigames/hatchlings.ts");
/* harmony import */ var _peggle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./peggle */ "./src/minigames/peggle.ts");




async function playPeggle() {
    return play(_peggle__WEBPACK_IMPORTED_MODULE_3__.peggle);
}
async function playFlappy() {
    return play(_flappy__WEBPACK_IMPORTED_MODULE_1__.flappy);
}
async function playHatchlings() {
    return play(_hatchlings__WEBPACK_IMPORTED_MODULE_2__.hatchlings);
}
async function play(minigame) {
    // Disable buttons
    document
        .querySelectorAll(".minigames-rules .flavr-button")
        .forEach((button) => {
        button.classList.add("disabled");
    });
    const json = await execute(minigame);
    $.flavrNotif(`Playing <strong>${minigame.name}</strong>...`);
    const gameToken = json.data;
    const score = randomInt(minigame.scoreMin, minigame.scoreMax);
    const enc_token = xorEncode(gameToken, score.toString());
    await new Promise((resolve) => setTimeout(resolve, randomInt(minigame.delayMin, minigame.delayMax)));
    await getPrizes(minigame, gameToken, score);
    await new Promise((resolve) => setTimeout(resolve, randomInt(1000, 3000)));
    await send(enc_token, score, minigame.name.toLowerCase());
    await new Promise((resolve) => setTimeout(resolve, randomInt(1000, 3000)));
}
function randomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1) + min);
}
async function execute(minigame) {
    return new Promise((resolve, reject) => {
        if (typeof Recaptcha !== "undefined") {
            Recaptcha.execute(`minigameStart${minigame.name}`, (token) => void startGame(minigame, token).then(resolve).catch(reject));
        }
        else {
            void startGame(minigame).then(resolve).catch(reject);
        }
    });
}
async function startGame(minigame, recaptchaToken) {
    return new Promise((resolve, reject) => void $.ajax({
        url: "/minigames/ajax_startGame",
        type: "post",
        dataType: "json",
        data: recaptchaToken
            ? {
                game: minigame.name.toLowerCase(),
                recaptchaToken: recaptchaToken,
            }
            : {
                game: minigame.name.toLowerCase(),
            },
        success: (json) => {
            resolve(json);
        },
        error: () => {
            reject();
        },
    }));
}
async function getPrizes(minigame, gameToken, score) {
    return new Promise((resolve) => void $.post("/minigames/ajax_getPrizes", { game: minigame.name.toLowerCase(), score: score }, (json) => {
        resolve(json);
        $.flavrNotif(`Played <strong>${minigame.name}</strong> for <strong class="price-item">${json.data.maana}</strong> <span class="maana-icon"></span>.`);
    }, "json").fail(() => setTimeout(() => {
        resolve(getPrizes(minigame, gameToken, score));
    }, randomInt(1000, 3000))));
}
/**
 * Sécurisation de l'envoi du score
 * Basé sur l'encodage XOR : http://en.wikipedia.org/wiki/XOR_cipher
 * Effectue un XOR bit à bit entre une chaine et une clé
 */
function xorEncode(str, key) {
    // Assure que les deux paramètres soient des chaines de caractère
    str = str.toString();
    key = key.toString();
    // Encodage XOR
    let xor = "";
    for (let i = 0; i < str.length; ++i) {
        let tmp = str[i];
        for (let j = 0; j < key.length; ++j) {
            tmp = String.fromCharCode(tmp.charCodeAt(0) ^ key.charCodeAt(j));
        }
        xor += tmp;
    }
    // Renvoie le résultat en encodant les caractères spéciaux pouvant poser problème (\n par exemple)
    return encodeURIComponent(xor);
}
async function send(enc_token, score, game) {
    return new Promise((resolve) => {
        if (typeof Recaptcha !== "undefined") {
            Recaptcha.execute("minigameSave" + game, (recaptchaToken) => void saveScore(enc_token, score, game, recaptchaToken).then(resolve));
        }
        else {
            void saveScore(enc_token, score, game).then(resolve);
        }
    });
}
async function saveScore(enc_token, score, game, recaptchaToken) {
    return new Promise((resolve) => {
        const token = decodeURIComponent(enc_token);
        void $.ajax({
            type: "post",
            url: "/minigames/ajax_saveScore",
            data: recaptchaToken
                ? {
                    token: token,
                    score: score,
                    game: game,
                    recaptchaToken: recaptchaToken,
                }
                : {
                    token: token,
                    score: score,
                    game: game,
                },
            success: () => {
                resolve();
            },
            error: () => setTimeout(() => {
                resolve(saveScore(enc_token, score, game));
            }, randomInt(1000, 3000)),
        });
    });
}


/***/ }),

/***/ "./src/minigames/flappy.ts":
/*!*********************************!*\
  !*** ./src/minigames/flappy.ts ***!
  \*********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "flappy": () => (/* binding */ flappy)
/* harmony export */ });
const flappy = {
    name: "Flappy",
    scoreMin: 180,
    scoreMax: 200,
    delayMin: 60_000,
    delayMax: 70_000,
    buttonSelector: '.minigame-start [href="/minigames/bubbltemple"] .nl-button',
};


/***/ }),

/***/ "./src/minigames/hatchlings.ts":
/*!*************************************!*\
  !*** ./src/minigames/hatchlings.ts ***!
  \*************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "hatchlings": () => (/* binding */ hatchlings)
/* harmony export */ });
const hatchlings = {
    name: "Hatchlings",
    scoreMin: 18,
    scoreMax: 20,
    delayMin: 30_000,
    delayMax: 30_000,
    buttonSelector: '.minigame-start [href="/minigames/cocooninpick"] .nl-button',
};


/***/ }),

/***/ "./src/minigames/peggle.ts":
/*!*********************************!*\
  !*** ./src/minigames/peggle.ts ***!
  \*********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "peggle": () => (/* binding */ peggle)
/* harmony export */ });
const peggle = {
    name: "Peggle",
    scoreMin: 9,
    scoreMax: 10,
    delayMin: 10_000,
    delayMax: 20_000,
    buttonSelector: '.minigame-start [href="/minigames/gembomb"] .nl-button',
};


/***/ }),

/***/ "./src/outfit.ts":
/*!***********************!*\
  !*** ./src/outfit.ts ***!
  \***********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "exportOutfit": () => (/* binding */ exportOutfit)
/* harmony export */ });
function exportOutfit(selector, name = "outfit") {
    const avatar = Sacha.Avatar.avatars[selector];
    if (!avatar)
        return;
    const outfit = getItemsToSave(avatar);
    const href = "data:text/json;charset=utf-8," +
        encodeURIComponent(JSON.stringify(outfit));
    const a = document.createElement("a");
    a.setAttribute("href", href);
    a.setAttribute("download", `${name}.json`);
    a.click();
}
function getItemsToSave(avatar) {
    return avatar.children.map((child) => {
        const item = child.getItem();
        return {
            id: item._id,
            group: item._group,
            name: item._name,
            image: item._image,
            type: item._type,
            categoryId: item._categoryId,
            hiddenCategories: Object.values(item._hiddenCategories),
            animationData: item._animationData,
            locked: item._locked,
        };
    });
}


/***/ }),

/***/ "./src/session_storage/session_storage.enum.ts":
/*!*****************************************************!*\
  !*** ./src/session_storage/session_storage.enum.ts ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "SessionStorageKey": () => (/* binding */ SessionStorageKey)
/* harmony export */ });
var SessionStorageKey;
(function (SessionStorageKey) {
    SessionStorageKey["takeover"] = "takeover";
    SessionStorageKey["minigamesDone"] = "minigamesDone";
})(SessionStorageKey || (SessionStorageKey = {}));


/***/ }),

/***/ "./src/session_storage/session_storage.ts":
/*!************************************************!*\
  !*** ./src/session_storage/session_storage.ts ***!
  \************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "SessionStorage": () => (/* binding */ SessionStorage)
/* harmony export */ });
/* harmony import */ var _session_storage_enum__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./session_storage.enum */ "./src/session_storage/session_storage.enum.ts");

class SessionStorage {
    static get minigamesDone() {
        return this.getBoolean(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.minigamesDone, false);
    }
    static set minigamesDone(done) {
        this.setItem(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.minigamesDone, done);
    }
    static get takeover() {
        return this.getBoolean(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.takeover, false);
    }
    static set takeover(enabled) {
        this.setItem(_session_storage_enum__WEBPACK_IMPORTED_MODULE_0__.SessionStorageKey.takeover, enabled);
    }
    static getBoolean(key, fallback) {
        return Boolean(JSON.parse(this.sessionStorage.getItem(key) ?? JSON.stringify(fallback)));
    }
    static setItem(key, value) {
        this.sessionStorage.setItem(key, JSON.stringify(value));
    }
}
SessionStorage.sessionStorage = sessionStorage;


/***/ }),

/***/ "./src/takeover/brain.ts":
/*!*******************************!*\
  !*** ./src/takeover/brain.ts ***!
  \*******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadTakeover": () => (/* binding */ loadTakeover),
/* harmony export */   "toggleTakeover": () => (/* binding */ toggleTakeover)
/* harmony export */ });
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");
/* harmony import */ var _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../session_storage/session_storage */ "./src/session_storage/session_storage.ts");
/* harmony import */ var _daily__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./daily */ "./src/takeover/daily.ts");
/* harmony import */ var _minigames__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./minigames */ "./src/takeover/minigames.ts");




/** Automated entry point of the takeover. */
function loadTakeover() {
    if (_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_1__.SessionStorage.takeover)
        void takeover();
}
/** Manual entry point of the takeover. */
function toggleTakeover() {
    resetTakeover();
    _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_1__.SessionStorage.takeover = !_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_1__.SessionStorage.takeover;
    if (_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_1__.SessionStorage.takeover)
        $.flavrNotif("Takeover mode enabled. Please do not interact with this tab.");
    else
        $.flavrNotif("Takeover mode disabled.");
    void takeover();
}
function resetTakeover() {
    _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_1__.SessionStorage.minigamesDone = false;
}
async function takeover() {
    if (!_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_1__.SessionStorage.takeover)
        return;
    if (await (0,_daily__WEBPACK_IMPORTED_MODULE_2__.loadDailies)())
        resetTakeover();
    if (_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.minigames && !_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_1__.SessionStorage.minigamesDone)
        if (await (0,_minigames__WEBPACK_IMPORTED_MODULE_3__.loadMinigames)())
            return;
        else
            return document
                .querySelector(".main-menu-minigames a")
                ?.click();
    // Refresh after 1h.
    setTimeout(() => {
        location.reload();
    }, 3.6e6);
}


/***/ }),

/***/ "./src/takeover/daily.ts":
/*!*******************************!*\
  !*** ./src/takeover/daily.ts ***!
  \*******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadDailies": () => (/* binding */ loadDailies)
/* harmony export */ });
async function loadDailies() {
    return new Promise((resolve) => {
        const dailyGiftContainer = document.getElementById("daily-gift-container");
        if (!dailyGiftContainer ||
            getComputedStyle(dailyGiftContainer).display === "none") {
            resolve(false);
            return;
        }
        dailyGiftContainer.click();
        const interval = setInterval(() => {
            const button = document.querySelector(".first-connexion .flavr-button.default");
            if (button) {
                clearInterval(interval);
                button.click();
                resolve(true);
            }
        }, 250);
    });
}


/***/ }),

/***/ "./src/takeover/minigames.ts":
/*!***********************************!*\
  !*** ./src/takeover/minigames.ts ***!
  \***********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadMinigames": () => (/* binding */ loadMinigames)
/* harmony export */ });
/* harmony import */ var _minigames_emile__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../minigames/emile */ "./src/minigames/emile.ts");
/* harmony import */ var _minigames_flappy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../minigames/flappy */ "./src/minigames/flappy.ts");
/* harmony import */ var _minigames_hatchlings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../minigames/hatchlings */ "./src/minigames/hatchlings.ts");
/* harmony import */ var _minigames_peggle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../minigames/peggle */ "./src/minigames/peggle.ts");
/* harmony import */ var _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../session_storage/session_storage */ "./src/session_storage/session_storage.ts");





async function loadMinigames() {
    switch (location.pathname) {
        case "/minigames": {
            const playing = loadMinigame(_minigames_peggle__WEBPACK_IMPORTED_MODULE_3__.peggle) ||
                loadMinigame(_minigames_flappy__WEBPACK_IMPORTED_MODULE_1__.flappy) ||
                loadMinigame(_minigames_hatchlings__WEBPACK_IMPORTED_MODULE_2__.hatchlings);
            if (!playing) {
                _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_4__.SessionStorage.minigamesDone = true;
                document
                    .querySelector('.minigames-rules [rel="btn-cancel"]')
                    ?.click();
            }
            return playing;
        }
        case "/minigames/gembomb":
            await (0,_minigames_emile__WEBPACK_IMPORTED_MODULE_0__.playPeggle)();
            break;
        case "/minigames/bubbltemple":
            await (0,_minigames_emile__WEBPACK_IMPORTED_MODULE_0__.playFlappy)();
            break;
        case "/minigames/cocooninpick":
            await (0,_minigames_emile__WEBPACK_IMPORTED_MODULE_0__.playHatchlings)();
            break;
        default:
            return false;
    }
    document.querySelector(".main-menu-minigames a")?.click();
    return true;
}
function loadMinigame(minigame) {
    const start = document.querySelector(minigame.buttonSelector);
    if (!start) {
        return false;
    }
    start.click();
    return true;
}


/***/ }),

/***/ "./src/ui/appearance.ts":
/*!******************************!*\
  !*** ./src/ui/appearance.ts ***!
  \******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadAppearance": () => (/* binding */ loadAppearance)
/* harmony export */ });
/* harmony import */ var _appearance_favorites_actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../appearance/favorites_actions */ "./src/appearance/favorites_actions.ts");

let observer;
function loadAppearance() {
    observer?.disconnect();
    observer = null;
    const appearanceItems = document.getElementById("appearance-items");
    if (!appearanceItems)
        return;
    observer = new MutationObserver(loadAppearance);
    observer.observe(appearanceItems, {
        childList: true,
    });
    loadFavoritesActions();
}
function loadFavoritesActions() {
    const actions = document.getElementById("favorites-actions");
    if (!actions || document.querySelector(".favorites-action-ee"))
        return;
    const actionTemplate = __webpack_require__(/*! ../templates/html/favorites_action.html */ "./src/templates/html/favorites_action.html");
    const exportAction = {
        id: "export-outfit",
        text: "Export",
    };
    const importAction = {
        id: "import-outfit",
        text: "Import",
    };
    actions.insertAdjacentHTML("beforeend", actionTemplate.render(exportAction));
    actions.insertAdjacentHTML("beforeend", actionTemplate.render(importAction));
    document
        .getElementById(exportAction.id)
        ?.addEventListener("click", _appearance_favorites_actions__WEBPACK_IMPORTED_MODULE_0__.exportPreview);
    document
        .getElementById(importAction.id)
        ?.addEventListener("click", _appearance_favorites_actions__WEBPACK_IMPORTED_MODULE_0__.importOutfit);
}


/***/ }),

/***/ "./src/ui/carousel.ts":
/*!****************************!*\
  !*** ./src/ui/carousel.ts ***!
  \****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadCarousel": () => (/* binding */ loadCarousel)
/* harmony export */ });
/* harmony import */ var _carousel_carousels__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../carousel/carousels */ "./src/carousel/carousels.ts");
/* harmony import */ var _carousel_carousel_download_face__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../carousel/carousel_download_face */ "./src/carousel/carousel_download_face.ts");
/* harmony import */ var _carousel_carousel_download_guardian__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../carousel/carousel_download_guardian */ "./src/carousel/carousel_download_guardian.ts");
/* harmony import */ var _carousel_carousel_takeover__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../carousel/carousel_takeover */ "./src/carousel/carousel_takeover.ts");
/* harmony import */ var _download_canvas__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../download-canvas */ "./src/download-canvas.ts");
/* harmony import */ var _takeover_brain__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../takeover/brain */ "./src/takeover/brain.ts");






function loadCarousel() {
    const carouselInner = document.querySelector("#carousel-inner");
    if (!carouselInner || document.querySelector(".carousel-ee")) {
        return;
    }
    // Import carousel template
    const template = __webpack_require__(/*! ../templates/html/carousel_news.html */ "./src/templates/html/carousel_news.html");
    // Add entries to the carousel
    carouselInner.insertAdjacentHTML("beforeend", _carousel_carousels__WEBPACK_IMPORTED_MODULE_0__.carousels.map((banner) => template.render(banner)).join("\n"));
    // Add click events
    document
        .getElementById(_carousel_carousel_download_face__WEBPACK_IMPORTED_MODULE_1__.carouselDownloadFace.id)
        ?.addEventListener("click", _download_canvas__WEBPACK_IMPORTED_MODULE_4__.downloadFace);
    document
        .getElementById(_carousel_carousel_download_guardian__WEBPACK_IMPORTED_MODULE_2__.carouselDownloadGuardian.id)
        ?.addEventListener("click", _download_canvas__WEBPACK_IMPORTED_MODULE_4__.downloadGuardian);
    document
        .getElementById(_carousel_carousel_takeover__WEBPACK_IMPORTED_MODULE_3__.carouselTakeover.id)
        ?.addEventListener("click", _takeover_brain__WEBPACK_IMPORTED_MODULE_5__.toggleTakeover);
}


/***/ }),

/***/ "./src/ui/home_content.ts":
/*!********************************!*\
  !*** ./src/ui/home_content.ts ***!
  \********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadHomeContent": () => (/* binding */ loadHomeContent)
/* harmony export */ });
function loadHomeContent() {
    const homeContentSmalls = document.getElementById("home-content-smalls");
    if (!homeContentSmalls ||
        homeContentSmalls.querySelector(".home-content-small-ee"))
        return;
    // Remove bank
    document.getElementById("home-bank")?.remove();
    // Add forum
    const smallTemplate = __webpack_require__(/*! ../templates/html/home_content_small.html */ "./src/templates/html/home_content_small.html");
    const smallContent = {
        backgroundImage: "/assets/img/minigames/treasurehunt/a48bbc4e4849745ebe6dbcf5313eb3f0.jpg",
        h4: "Forum",
        href: "/forum",
        id: "forum",
    };
    homeContentSmalls.insertAdjacentHTML("beforeend", smallTemplate.render(smallContent));
}


/***/ }),

/***/ "./src/ui/menu.ts":
/*!************************!*\
  !*** ./src/ui/menu.ts ***!
  \************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadMenu": () => (/* binding */ loadMenu)
/* harmony export */ });
function loadMenu() {
    const menuInnerRight = document.getElementById("menu-inner-right");
    if (!menuInnerRight || menuInnerRight.querySelector(".main-menu-ee"))
        return;
    // Remove bank
    menuInnerRight.querySelector(".main-menu-bank")?.remove();
    // Add Forum
    const menuTemplate = __webpack_require__(/*! ../templates/html/main_menu.html */ "./src/templates/html/main_menu.html");
    const mainMenuForum = {
        class: "forum",
        href: "/forum",
        text: "Forum",
    };
    menuInnerRight.insertAdjacentHTML("beforeend", menuTemplate.render(mainMenuForum));
}


/***/ }),

/***/ "./src/ui/profile.ts":
/*!***************************!*\
  !*** ./src/ui/profile.ts ***!
  \***************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadProfile": () => (/* binding */ loadProfile)
/* harmony export */ });
/* harmony import */ var _outfit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../outfit */ "./src/outfit.ts");

function loadProfile() {
    const profileContactActions = document.getElementById("profile-contact-actions");
    if (!profileContactActions ||
        document.querySelector(".profile-contact-action-ee")) {
        return;
    }
    const template = __webpack_require__(/*! ../templates/html/profile_contact_action.html */ "./src/templates/html/profile_contact_action.html");
    const profileActionExport = {
        id: "profile-contact-action-export",
        actionDescription: "Export outfit",
    };
    // Add entries
    profileContactActions.insertAdjacentHTML("beforeend", template.render(profileActionExport));
    // Add click events
    document
        .getElementById(profileActionExport.id)
        ?.addEventListener("click", exportProfile);
}
function exportProfile() {
    const title = document.querySelector("#main-section .section-title");
    const keys = Object.keys(Sacha.Avatar.avatars).filter((key) => key.startsWith("#playerProfileAvatar"));
    keys.forEach((key) => {
        (0,_outfit__WEBPACK_IMPORTED_MODULE_0__.exportOutfit)(key, title?.textContent?.trim());
    });
}


/***/ }),

/***/ "./src/ui/settings.ts":
/*!****************************!*\
  !*** ./src/ui/settings.ts ***!
  \****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "loadSettings": () => (/* binding */ loadSettings)
/* harmony export */ });
/* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts");

function loadSettings() {
    const accountRight = document.querySelector("#account-right div");
    if (!accountRight || accountRight.querySelector(".account-ee-bloc"))
        return;
    const settingsTemplate = __webpack_require__(/*! ../templates/html/settings.html */ "./src/templates/html/settings.html");
    accountRight.insertAdjacentHTML("beforeend", settingsTemplate.render(_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.settings));
    document
        .getElementById("ee-minigames-enabled")
        ?.addEventListener("click", () => {
        _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.minigames = !_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.minigames;
        reloadSettings();
    });
}
function reloadSettings() {
    document.querySelector(".account-ee-bloc")?.remove();
    loadSettings();
}


/***/ })

/******/ 	});
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
/******/ 		if (cachedModule !== undefined) {
/******/ 			return cachedModule.exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = __webpack_module_cache__[moduleId] = {
/******/ 			// no module.id needed
/******/ 			// no module.loaded needed
/******/ 			exports: {}
/******/ 		};
/******/ 	
/******/ 		// Execute the module function
/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 	
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/ 	
/************************************************************************/
/******/ 	/* webpack/runtime/compat get default export */
/******/ 	(() => {
/******/ 		// getDefaultExport function for compatibility with non-harmony modules
/******/ 		__webpack_require__.n = (module) => {
/******/ 			var getter = module && module.__esModule ?
/******/ 				() => (module['default']) :
/******/ 				() => (module);
/******/ 			__webpack_require__.d(getter, { a: getter });
/******/ 			return getter;
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/define property getters */
/******/ 	(() => {
/******/ 		// define getter functions for harmony exports
/******/ 		__webpack_require__.d = (exports, definition) => {
/******/ 			for(var key in definition) {
/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 				}
/******/ 			}
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
/******/ 	(() => {
/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/make namespace object */
/******/ 	(() => {
/******/ 		// define __esModule on exports
/******/ 		__webpack_require__.r = (exports) => {
/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 			}
/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
/******/ 		};
/******/ 	})();
/******/ 	
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
(() => {
"use strict";
/*!*********************!*\
  !*** ./src/main.ts ***!
  \*********************/
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _takeover_brain__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./takeover/brain */ "./src/takeover/brain.ts");
/* harmony import */ var _ui_appearance__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui/appearance */ "./src/ui/appearance.ts");
/* harmony import */ var _ui_carousel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ui/carousel */ "./src/ui/carousel.ts");
/* harmony import */ var _ui_home_content__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ui/home_content */ "./src/ui/home_content.ts");
/* harmony import */ var _ui_menu__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ui/menu */ "./src/ui/menu.ts");
/* harmony import */ var _ui_profile__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ui/profile */ "./src/ui/profile.ts");
/* harmony import */ var _ui_settings__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ui/settings */ "./src/ui/settings.ts");







function load() {
    loadUI();
    (0,_takeover_brain__WEBPACK_IMPORTED_MODULE_0__.loadTakeover)();
}
function loadUI() {
    (0,_ui_menu__WEBPACK_IMPORTED_MODULE_4__.loadMenu)();
    (0,_ui_carousel__WEBPACK_IMPORTED_MODULE_2__.loadCarousel)();
    (0,_ui_home_content__WEBPACK_IMPORTED_MODULE_3__.loadHomeContent)();
    (0,_ui_appearance__WEBPACK_IMPORTED_MODULE_1__.loadAppearance)();
    (0,_ui_profile__WEBPACK_IMPORTED_MODULE_5__.loadProfile)();
    (0,_ui_settings__WEBPACK_IMPORTED_MODULE_6__.loadSettings)();
}
new MutationObserver(load).observe(document.getElementById("container"), {
    childList: true,
});
load();
console.log("Eldarya Enhancements loaded.");

})();

/******/ })()
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL25vZGVfbW9kdWxlcy9ob2dhbi5qcy9saWIvY29tcGlsZXIuanMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9ub2RlX21vZHVsZXMvaG9nYW4uanMvbGliL2hvZ2FuLmpzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vbm9kZV9tb2R1bGVzL2hvZ2FuLmpzL2xpYi90ZW1wbGF0ZS5qcyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9jYXJvdXNlbF9uZXdzLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvZmF2b3JpdGVzX2FjdGlvbi5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2hvbWVfY29udGVudF9zbWFsbC5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL21haW5fbWVudS5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL3Byb2ZpbGVfY29udGFjdF9hY3Rpb24uaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9zZXR0aW5ncy5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2FwcGVhcmFuY2UvZmF2b3JpdGVzX2FjdGlvbnMudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvY2Fyb3VzZWwvY2Fyb3VzZWxfYmVlbW9vdl9hbm5veWFuY2VzLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2Nhcm91c2VsL2Nhcm91c2VsX2Rvd25sb2FkX2ZhY2UudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvY2Fyb3VzZWwvY2Fyb3VzZWxfZG93bmxvYWRfZ3VhcmRpYW4udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvY2Fyb3VzZWwvY2Fyb3VzZWxfZWxkYXJ5YV9lbmhhbmNlbWVudHMudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvY2Fyb3VzZWwvY2Fyb3VzZWxfdGFrZW92ZXIudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvY2Fyb3VzZWwvY2Fyb3VzZWxzLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2Rvd25sb2FkLWNhbnZhcy50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2UuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2UudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvbWluaWdhbWVzL2VtaWxlLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL21pbmlnYW1lcy9mbGFwcHkudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvbWluaWdhbWVzL2hhdGNobGluZ3MudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvbWluaWdhbWVzL3BlZ2dsZS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9vdXRmaXQudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvc2Vzc2lvbl9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZS5lbnVtLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3Nlc3Npb25fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2UudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGFrZW92ZXIvYnJhaW4udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGFrZW92ZXIvZGFpbHkudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGFrZW92ZXIvbWluaWdhbWVzLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3VpL2FwcGVhcmFuY2UudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdWkvY2Fyb3VzZWwudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdWkvaG9tZV9jb250ZW50LnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3VpL21lbnUudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdWkvcHJvZmlsZS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy91aS9zZXR0aW5ncy50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2Vs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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2Q0FBNkMsV0FBVyxFQUFFOztBQUUxRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSw4Q0FBOEM7QUFDOUMsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDLFFBQVE7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7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QUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBTyxRQUFRLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFO0lBQzdFLFNBQVMsRUFBRSxJQUFJO0NBQ2hCLENBQUMsQ0FBQztBQUNILElBQUksRUFBRSxDQUFDO0FBRVAsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDIiwiZmlsZSI6ImVsZGFyeWEtZW5oYW5jZW1lbnRzLnVzZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogIENvcHlyaWdodCAyMDExIFR3aXR0ZXIsIEluYy5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbihmdW5jdGlvbiAoSG9nYW4pIHtcbiAgLy8gU2V0dXAgcmVnZXggIGFzc2lnbm1lbnRzXG4gIC8vIHJlbW92ZSB3aGl0ZXNwYWNlIGFjY29yZGluZyB0byBNdXN0YWNoZSBzcGVjXG4gIHZhciBySXNXaGl0ZXNwYWNlID0gL1xcUy8sXG4gICAgICByUXVvdCA9IC9cXFwiL2csXG4gICAgICByTmV3bGluZSA9ICAvXFxuL2csXG4gICAgICByQ3IgPSAvXFxyL2csXG4gICAgICByU2xhc2ggPSAvXFxcXC9nLFxuICAgICAgckxpbmVTZXAgPSAvXFx1MjAyOC8sXG4gICAgICByUGFyYWdyYXBoU2VwID0gL1xcdTIwMjkvO1xuXG4gIEhvZ2FuLnRhZ3MgPSB7XG4gICAgJyMnOiAxLCAnXic6IDIsICc8JzogMywgJyQnOiA0LFxuICAgICcvJzogNSwgJyEnOiA2LCAnPic6IDcsICc9JzogOCwgJ192JzogOSxcbiAgICAneyc6IDEwLCAnJic6IDExLCAnX3QnOiAxMlxuICB9O1xuXG4gIEhvZ2FuLnNjYW4gPSBmdW5jdGlvbiBzY2FuKHRleHQsIGRlbGltaXRlcnMpIHtcbiAgICB2YXIgbGVuID0gdGV4dC5sZW5ndGgsXG4gICAgICAgIElOX1RFWFQgPSAwLFxuICAgICAgICBJTl9UQUdfVFlQRSA9IDEsXG4gICAgICAgIElOX1RBRyA9IDIsXG4gICAgICAgIHN0YXRlID0gSU5fVEVYVCxcbiAgICAgICAgdGFnVHlwZSA9IG51bGwsXG4gICAgICAgIHRhZyA9IG51bGwsXG4gICAgICAgIGJ1ZiA9ICcnLFxuICAgICAgICB0b2tlbnMgPSBbXSxcbiAgICAgICAgc2VlblRhZyA9IGZhbHNlLFxuICAgICAgICBpID0gMCxcbiAgICAgICAgbGluZVN0YXJ0ID0gMCxcbiAgICAgICAgb3RhZyA9ICd7eycsXG4gICAgICAgIGN0YWcgPSAnfX0nO1xuXG4gICAgZnVuY3Rpb24gYWRkQnVmKCkge1xuICAgICAgaWYgKGJ1Zi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRva2Vucy5wdXNoKHt0YWc6ICdfdCcsIHRleHQ6IG5ldyBTdHJpbmcoYnVmKX0pO1xuICAgICAgICBidWYgPSAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lSXNXaGl0ZXNwYWNlKCkge1xuICAgICAgdmFyIGlzQWxsV2hpdGVzcGFjZSA9IHRydWU7XG4gICAgICBmb3IgKHZhciBqID0gbGluZVN0YXJ0OyBqIDwgdG9rZW5zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlzQWxsV2hpdGVzcGFjZSA9XG4gICAgICAgICAgKEhvZ2FuLnRhZ3NbdG9rZW5zW2pdLnRhZ10gPCBIb2dhbi50YWdzWydfdiddKSB8fFxuICAgICAgICAgICh0b2tlbnNbal0udGFnID09ICdfdCcgJiYgdG9rZW5zW2pdLnRleHQubWF0Y2gocklzV2hpdGVzcGFjZSkgPT09IG51bGwpO1xuICAgICAgICBpZiAoIWlzQWxsV2hpdGVzcGFjZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXNBbGxXaGl0ZXNwYWNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpbHRlckxpbmUoaGF2ZVNlZW5UYWcsIG5vTmV3TGluZSkge1xuICAgICAgYWRkQnVmKCk7XG5cbiAgICAgIGlmIChoYXZlU2VlblRhZyAmJiBsaW5lSXNXaGl0ZXNwYWNlKCkpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IGxpbmVTdGFydCwgbmV4dDsgaiA8IHRva2Vucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICh0b2tlbnNbal0udGV4dCkge1xuICAgICAgICAgICAgaWYgKChuZXh0ID0gdG9rZW5zW2orMV0pICYmIG5leHQudGFnID09ICc+Jykge1xuICAgICAgICAgICAgICAvLyBzZXQgaW5kZW50IHRvIHRva2VuIHZhbHVlXG4gICAgICAgICAgICAgIG5leHQuaW5kZW50ID0gdG9rZW5zW2pdLnRleHQudG9TdHJpbmcoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9rZW5zLnNwbGljZShqLCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIW5vTmV3TGluZSkge1xuICAgICAgICB0b2tlbnMucHVzaCh7dGFnOidcXG4nfSk7XG4gICAgICB9XG5cbiAgICAgIHNlZW5UYWcgPSBmYWxzZTtcbiAgICAgIGxpbmVTdGFydCA9IHRva2Vucy5sZW5ndGg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hhbmdlRGVsaW1pdGVycyh0ZXh0LCBpbmRleCkge1xuICAgICAgdmFyIGNsb3NlID0gJz0nICsgY3RhZyxcbiAgICAgICAgICBjbG9zZUluZGV4ID0gdGV4dC5pbmRleE9mKGNsb3NlLCBpbmRleCksXG4gICAgICAgICAgZGVsaW1pdGVycyA9IHRyaW0oXG4gICAgICAgICAgICB0ZXh0LnN1YnN0cmluZyh0ZXh0LmluZGV4T2YoJz0nLCBpbmRleCkgKyAxLCBjbG9zZUluZGV4KVxuICAgICAgICAgICkuc3BsaXQoJyAnKTtcblxuICAgICAgb3RhZyA9IGRlbGltaXRlcnNbMF07XG4gICAgICBjdGFnID0gZGVsaW1pdGVyc1tkZWxpbWl0ZXJzLmxlbmd0aCAtIDFdO1xuXG4gICAgICByZXR1cm4gY2xvc2VJbmRleCArIGNsb3NlLmxlbmd0aCAtIDE7XG4gICAgfVxuXG4gICAgaWYgKGRlbGltaXRlcnMpIHtcbiAgICAgIGRlbGltaXRlcnMgPSBkZWxpbWl0ZXJzLnNwbGl0KCcgJyk7XG4gICAgICBvdGFnID0gZGVsaW1pdGVyc1swXTtcbiAgICAgIGN0YWcgPSBkZWxpbWl0ZXJzWzFdO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKHN0YXRlID09IElOX1RFWFQpIHtcbiAgICAgICAgaWYgKHRhZ0NoYW5nZShvdGFnLCB0ZXh0LCBpKSkge1xuICAgICAgICAgIC0taTtcbiAgICAgICAgICBhZGRCdWYoKTtcbiAgICAgICAgICBzdGF0ZSA9IElOX1RBR19UWVBFO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PSAnXFxuJykge1xuICAgICAgICAgICAgZmlsdGVyTGluZShzZWVuVGFnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnVmICs9IHRleHQuY2hhckF0KGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBJTl9UQUdfVFlQRSkge1xuICAgICAgICBpICs9IG90YWcubGVuZ3RoIC0gMTtcbiAgICAgICAgdGFnID0gSG9nYW4udGFnc1t0ZXh0LmNoYXJBdChpICsgMSldO1xuICAgICAgICB0YWdUeXBlID0gdGFnID8gdGV4dC5jaGFyQXQoaSArIDEpIDogJ192JztcbiAgICAgICAgaWYgKHRhZ1R5cGUgPT0gJz0nKSB7XG4gICAgICAgICAgaSA9IGNoYW5nZURlbGltaXRlcnModGV4dCwgaSk7XG4gICAgICAgICAgc3RhdGUgPSBJTl9URVhUO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0YWcpIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdGUgPSBJTl9UQUc7XG4gICAgICAgIH1cbiAgICAgICAgc2VlblRhZyA9IGk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGFnQ2hhbmdlKGN0YWcsIHRleHQsIGkpKSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2goe3RhZzogdGFnVHlwZSwgbjogdHJpbShidWYpLCBvdGFnOiBvdGFnLCBjdGFnOiBjdGFnLFxuICAgICAgICAgICAgICAgICAgICAgICBpOiAodGFnVHlwZSA9PSAnLycpID8gc2VlblRhZyAtIG90YWcubGVuZ3RoIDogaSArIGN0YWcubGVuZ3RofSk7XG4gICAgICAgICAgYnVmID0gJyc7XG4gICAgICAgICAgaSArPSBjdGFnLmxlbmd0aCAtIDE7XG4gICAgICAgICAgc3RhdGUgPSBJTl9URVhUO1xuICAgICAgICAgIGlmICh0YWdUeXBlID09ICd7Jykge1xuICAgICAgICAgICAgaWYgKGN0YWcgPT0gJ319Jykge1xuICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjbGVhblRyaXBsZVN0YWNoZSh0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVmICs9IHRleHQuY2hhckF0KGkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmlsdGVyTGluZShzZWVuVGFnLCB0cnVlKTtcblxuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhblRyaXBsZVN0YWNoZSh0b2tlbikge1xuICAgIGlmICh0b2tlbi5uLnN1YnN0cih0b2tlbi5uLmxlbmd0aCAtIDEpID09PSAnfScpIHtcbiAgICAgIHRva2VuLm4gPSB0b2tlbi5uLnN1YnN0cmluZygwLCB0b2tlbi5uLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRyaW0ocykge1xuICAgIGlmIChzLnRyaW0pIHtcbiAgICAgIHJldHVybiBzLnRyaW0oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcy5yZXBsYWNlKC9eXFxzKnxcXHMqJC9nLCAnJyk7XG4gIH1cblxuICBmdW5jdGlvbiB0YWdDaGFuZ2UodGFnLCB0ZXh0LCBpbmRleCkge1xuICAgIGlmICh0ZXh0LmNoYXJBdChpbmRleCkgIT0gdGFnLmNoYXJBdCgwKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAxLCBsID0gdGFnLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKHRleHQuY2hhckF0KGluZGV4ICsgaSkgIT0gdGFnLmNoYXJBdChpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyB0aGUgdGFncyBhbGxvd2VkIGluc2lkZSBzdXBlciB0ZW1wbGF0ZXNcbiAgdmFyIGFsbG93ZWRJblN1cGVyID0geydfdCc6IHRydWUsICdcXG4nOiB0cnVlLCAnJCc6IHRydWUsICcvJzogdHJ1ZX07XG5cbiAgZnVuY3Rpb24gYnVpbGRUcmVlKHRva2Vucywga2luZCwgc3RhY2ssIGN1c3RvbVRhZ3MpIHtcbiAgICB2YXIgaW5zdHJ1Y3Rpb25zID0gW10sXG4gICAgICAgIG9wZW5lciA9IG51bGwsXG4gICAgICAgIHRhaWwgPSBudWxsLFxuICAgICAgICB0b2tlbiA9IG51bGw7XG5cbiAgICB0YWlsID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG5cbiAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRva2VuID0gdG9rZW5zLnNoaWZ0KCk7XG5cbiAgICAgIGlmICh0YWlsICYmIHRhaWwudGFnID09ICc8JyAmJiAhKHRva2VuLnRhZyBpbiBhbGxvd2VkSW5TdXBlcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGNvbnRlbnQgaW4gPCBzdXBlciB0YWcuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChIb2dhbi50YWdzW3Rva2VuLnRhZ10gPD0gSG9nYW4udGFnc1snJCddIHx8IGlzT3BlbmVyKHRva2VuLCBjdXN0b21UYWdzKSkge1xuICAgICAgICBzdGFjay5wdXNoKHRva2VuKTtcbiAgICAgICAgdG9rZW4ubm9kZXMgPSBidWlsZFRyZWUodG9rZW5zLCB0b2tlbi50YWcsIHN0YWNrLCBjdXN0b21UYWdzKTtcbiAgICAgIH0gZWxzZSBpZiAodG9rZW4udGFnID09ICcvJykge1xuICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDbG9zaW5nIHRhZyB3aXRob3V0IG9wZW5lcjogLycgKyB0b2tlbi5uKTtcbiAgICAgICAgfVxuICAgICAgICBvcGVuZXIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgaWYgKHRva2VuLm4gIT0gb3BlbmVyLm4gJiYgIWlzQ2xvc2VyKHRva2VuLm4sIG9wZW5lci5uLCBjdXN0b21UYWdzKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmVzdGluZyBlcnJvcjogJyArIG9wZW5lci5uICsgJyB2cy4gJyArIHRva2VuLm4pO1xuICAgICAgICB9XG4gICAgICAgIG9wZW5lci5lbmQgPSB0b2tlbi5pO1xuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25zO1xuICAgICAgfSBlbHNlIGlmICh0b2tlbi50YWcgPT0gJ1xcbicpIHtcbiAgICAgICAgdG9rZW4ubGFzdCA9ICh0b2tlbnMubGVuZ3RoID09IDApIHx8ICh0b2tlbnNbMF0udGFnID09ICdcXG4nKTtcbiAgICAgIH1cblxuICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2godG9rZW4pO1xuICAgIH1cblxuICAgIGlmIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2xvc2luZyB0YWc6ICcgKyBzdGFjay5wb3AoKS5uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdHJ1Y3Rpb25zO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNPcGVuZXIodG9rZW4sIHRhZ3MpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRhZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAodGFnc1tpXS5vID09IHRva2VuLm4pIHtcbiAgICAgICAgdG9rZW4udGFnID0gJyMnO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc0Nsb3NlcihjbG9zZSwgb3BlbiwgdGFncykge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGFncy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmICh0YWdzW2ldLmMgPT0gY2xvc2UgJiYgdGFnc1tpXS5vID09IG9wZW4pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RyaW5naWZ5U3Vic3RpdHV0aW9ucyhvYmopIHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpdGVtcy5wdXNoKCdcIicgKyBlc2Moa2V5KSArICdcIjogZnVuY3Rpb24oYyxwLHQsaSkgeycgKyBvYmpba2V5XSArICd9Jyk7XG4gICAgfVxuICAgIHJldHVybiBcInsgXCIgKyBpdGVtcy5qb2luKFwiLFwiKSArIFwiIH1cIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0cmluZ2lmeVBhcnRpYWxzKGNvZGVPYmopIHtcbiAgICB2YXIgcGFydGlhbHMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gY29kZU9iai5wYXJ0aWFscykge1xuICAgICAgcGFydGlhbHMucHVzaCgnXCInICsgZXNjKGtleSkgKyAnXCI6e25hbWU6XCInICsgZXNjKGNvZGVPYmoucGFydGlhbHNba2V5XS5uYW1lKSArICdcIiwgJyArIHN0cmluZ2lmeVBhcnRpYWxzKGNvZGVPYmoucGFydGlhbHNba2V5XSkgKyBcIn1cIik7XG4gICAgfVxuICAgIHJldHVybiBcInBhcnRpYWxzOiB7XCIgKyBwYXJ0aWFscy5qb2luKFwiLFwiKSArIFwifSwgc3ViczogXCIgKyBzdHJpbmdpZnlTdWJzdGl0dXRpb25zKGNvZGVPYmouc3Vicyk7XG4gIH1cblxuICBIb2dhbi5zdHJpbmdpZnkgPSBmdW5jdGlvbihjb2RlT2JqLCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIFwie2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyBcIiArIEhvZ2FuLndyYXBNYWluKGNvZGVPYmouY29kZSkgKyBcIiB9LFwiICsgc3RyaW5naWZ5UGFydGlhbHMoY29kZU9iaikgKyAgXCJ9XCI7XG4gIH1cblxuICB2YXIgc2VyaWFsTm8gPSAwO1xuICBIb2dhbi5nZW5lcmF0ZSA9IGZ1bmN0aW9uKHRyZWUsIHRleHQsIG9wdGlvbnMpIHtcbiAgICBzZXJpYWxObyA9IDA7XG4gICAgdmFyIGNvbnRleHQgPSB7IGNvZGU6ICcnLCBzdWJzOiB7fSwgcGFydGlhbHM6IHt9IH07XG4gICAgSG9nYW4ud2Fsayh0cmVlLCBjb250ZXh0KTtcblxuICAgIGlmIChvcHRpb25zLmFzU3RyaW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJpbmdpZnkoY29udGV4dCwgdGV4dCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubWFrZVRlbXBsYXRlKGNvbnRleHQsIHRleHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgSG9nYW4ud3JhcE1haW4gPSBmdW5jdGlvbihjb2RlKSB7XG4gICAgcmV0dXJuICd2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpOycgKyBjb2RlICsgJ3JldHVybiB0LmZsKCk7JztcbiAgfVxuXG4gIEhvZ2FuLnRlbXBsYXRlID0gSG9nYW4uVGVtcGxhdGU7XG5cbiAgSG9nYW4ubWFrZVRlbXBsYXRlID0gZnVuY3Rpb24oY29kZU9iaiwgdGV4dCwgb3B0aW9ucykge1xuICAgIHZhciB0ZW1wbGF0ZSA9IHRoaXMubWFrZVBhcnRpYWxzKGNvZGVPYmopO1xuICAgIHRlbXBsYXRlLmNvZGUgPSBuZXcgRnVuY3Rpb24oJ2MnLCAncCcsICdpJywgdGhpcy53cmFwTWFpbihjb2RlT2JqLmNvZGUpKTtcbiAgICByZXR1cm4gbmV3IHRoaXMudGVtcGxhdGUodGVtcGxhdGUsIHRleHQsIHRoaXMsIG9wdGlvbnMpO1xuICB9XG5cbiAgSG9nYW4ubWFrZVBhcnRpYWxzID0gZnVuY3Rpb24oY29kZU9iaikge1xuICAgIHZhciBrZXksIHRlbXBsYXRlID0ge3N1YnM6IHt9LCBwYXJ0aWFsczogY29kZU9iai5wYXJ0aWFscywgbmFtZTogY29kZU9iai5uYW1lfTtcbiAgICBmb3IgKGtleSBpbiB0ZW1wbGF0ZS5wYXJ0aWFscykge1xuICAgICAgdGVtcGxhdGUucGFydGlhbHNba2V5XSA9IHRoaXMubWFrZVBhcnRpYWxzKHRlbXBsYXRlLnBhcnRpYWxzW2tleV0pO1xuICAgIH1cbiAgICBmb3IgKGtleSBpbiBjb2RlT2JqLnN1YnMpIHtcbiAgICAgIHRlbXBsYXRlLnN1YnNba2V5XSA9IG5ldyBGdW5jdGlvbignYycsICdwJywgJ3QnLCAnaScsIGNvZGVPYmouc3Vic1trZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9XG5cbiAgZnVuY3Rpb24gZXNjKHMpIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKHJTbGFzaCwgJ1xcXFxcXFxcJylcbiAgICAgICAgICAgIC5yZXBsYWNlKHJRdW90LCAnXFxcXFxcXCInKVxuICAgICAgICAgICAgLnJlcGxhY2Uock5ld2xpbmUsICdcXFxcbicpXG4gICAgICAgICAgICAucmVwbGFjZShyQ3IsICdcXFxccicpXG4gICAgICAgICAgICAucmVwbGFjZShyTGluZVNlcCwgJ1xcXFx1MjAyOCcpXG4gICAgICAgICAgICAucmVwbGFjZShyUGFyYWdyYXBoU2VwLCAnXFxcXHUyMDI5Jyk7XG4gIH1cblxuICBmdW5jdGlvbiBjaG9vc2VNZXRob2Qocykge1xuICAgIHJldHVybiAofnMuaW5kZXhPZignLicpKSA/ICdkJyA6ICdmJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVBhcnRpYWwobm9kZSwgY29udGV4dCkge1xuICAgIHZhciBwcmVmaXggPSBcIjxcIiArIChjb250ZXh0LnByZWZpeCB8fCBcIlwiKTtcbiAgICB2YXIgc3ltID0gcHJlZml4ICsgbm9kZS5uICsgc2VyaWFsTm8rKztcbiAgICBjb250ZXh0LnBhcnRpYWxzW3N5bV0gPSB7bmFtZTogbm9kZS5uLCBwYXJ0aWFsczoge319O1xuICAgIGNvbnRleHQuY29kZSArPSAndC5iKHQucnAoXCInICsgIGVzYyhzeW0pICsgJ1wiLGMscCxcIicgKyAobm9kZS5pbmRlbnQgfHwgJycpICsgJ1wiKSk7JztcbiAgICByZXR1cm4gc3ltO1xuICB9XG5cbiAgSG9nYW4uY29kZWdlbiA9IHtcbiAgICAnIyc6IGZ1bmN0aW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgICAgIGNvbnRleHQuY29kZSArPSAnaWYodC5zKHQuJyArIGNob29zZU1ldGhvZChub2RlLm4pICsgJyhcIicgKyBlc2Mobm9kZS5uKSArICdcIixjLHAsMSksJyArXG4gICAgICAgICAgICAgICAgICAgICAgJ2MscCwwLCcgKyBub2RlLmkgKyAnLCcgKyBub2RlLmVuZCArICcsXCInICsgbm9kZS5vdGFnICsgXCIgXCIgKyBub2RlLmN0YWcgKyAnXCIpKXsnICtcbiAgICAgICAgICAgICAgICAgICAgICAndC5ycyhjLHAsJyArICdmdW5jdGlvbihjLHAsdCl7JztcbiAgICAgIEhvZ2FuLndhbGsobm9kZS5ub2RlcywgY29udGV4dCk7XG4gICAgICBjb250ZXh0LmNvZGUgKz0gJ30pO2MucG9wKCk7fSc7XG4gICAgfSxcblxuICAgICdeJzogZnVuY3Rpb24obm9kZSwgY29udGV4dCkge1xuICAgICAgY29udGV4dC5jb2RlICs9ICdpZighdC5zKHQuJyArIGNob29zZU1ldGhvZChub2RlLm4pICsgJyhcIicgKyBlc2Mobm9kZS5uKSArICdcIixjLHAsMSksYyxwLDEsMCwwLFwiXCIpKXsnO1xuICAgICAgSG9nYW4ud2Fsayhub2RlLm5vZGVzLCBjb250ZXh0KTtcbiAgICAgIGNvbnRleHQuY29kZSArPSAnfTsnO1xuICAgIH0sXG5cbiAgICAnPic6IGNyZWF0ZVBhcnRpYWwsXG4gICAgJzwnOiBmdW5jdGlvbihub2RlLCBjb250ZXh0KSB7XG4gICAgICB2YXIgY3R4ID0ge3BhcnRpYWxzOiB7fSwgY29kZTogJycsIHN1YnM6IHt9LCBpblBhcnRpYWw6IHRydWV9O1xuICAgICAgSG9nYW4ud2Fsayhub2RlLm5vZGVzLCBjdHgpO1xuICAgICAgdmFyIHRlbXBsYXRlID0gY29udGV4dC5wYXJ0aWFsc1tjcmVhdGVQYXJ0aWFsKG5vZGUsIGNvbnRleHQpXTtcbiAgICAgIHRlbXBsYXRlLnN1YnMgPSBjdHguc3VicztcbiAgICAgIHRlbXBsYXRlLnBhcnRpYWxzID0gY3R4LnBhcnRpYWxzO1xuICAgIH0sXG5cbiAgICAnJCc6IGZ1bmN0aW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgICAgIHZhciBjdHggPSB7c3Viczoge30sIGNvZGU6ICcnLCBwYXJ0aWFsczogY29udGV4dC5wYXJ0aWFscywgcHJlZml4OiBub2RlLm59O1xuICAgICAgSG9nYW4ud2Fsayhub2RlLm5vZGVzLCBjdHgpO1xuICAgICAgY29udGV4dC5zdWJzW25vZGUubl0gPSBjdHguY29kZTtcbiAgICAgIGlmICghY29udGV4dC5pblBhcnRpYWwpIHtcbiAgICAgICAgY29udGV4dC5jb2RlICs9ICd0LnN1YihcIicgKyBlc2Mobm9kZS5uKSArICdcIixjLHAsaSk7JztcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ1xcbic6IGZ1bmN0aW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgICAgIGNvbnRleHQuY29kZSArPSB3cml0ZSgnXCJcXFxcblwiJyArIChub2RlLmxhc3QgPyAnJyA6ICcgKyBpJykpO1xuICAgIH0sXG5cbiAgICAnX3YnOiBmdW5jdGlvbihub2RlLCBjb250ZXh0KSB7XG4gICAgICBjb250ZXh0LmNvZGUgKz0gJ3QuYih0LnYodC4nICsgY2hvb3NlTWV0aG9kKG5vZGUubikgKyAnKFwiJyArIGVzYyhub2RlLm4pICsgJ1wiLGMscCwwKSkpOyc7XG4gICAgfSxcblxuICAgICdfdCc6IGZ1bmN0aW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgICAgIGNvbnRleHQuY29kZSArPSB3cml0ZSgnXCInICsgZXNjKG5vZGUudGV4dCkgKyAnXCInKTtcbiAgICB9LFxuXG4gICAgJ3snOiB0cmlwbGVTdGFjaGUsXG5cbiAgICAnJic6IHRyaXBsZVN0YWNoZVxuICB9XG5cbiAgZnVuY3Rpb24gdHJpcGxlU3RhY2hlKG5vZGUsIGNvbnRleHQpIHtcbiAgICBjb250ZXh0LmNvZGUgKz0gJ3QuYih0LnQodC4nICsgY2hvb3NlTWV0aG9kKG5vZGUubikgKyAnKFwiJyArIGVzYyhub2RlLm4pICsgJ1wiLGMscCwwKSkpOyc7XG4gIH1cblxuICBmdW5jdGlvbiB3cml0ZShzKSB7XG4gICAgcmV0dXJuICd0LmIoJyArIHMgKyAnKTsnO1xuICB9XG5cbiAgSG9nYW4ud2FsayA9IGZ1bmN0aW9uKG5vZGVsaXN0LCBjb250ZXh0KSB7XG4gICAgdmFyIGZ1bmM7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2RlbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGZ1bmMgPSBIb2dhbi5jb2RlZ2VuW25vZGVsaXN0W2ldLnRhZ107XG4gICAgICBmdW5jICYmIGZ1bmMobm9kZWxpc3RbaV0sIGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuXG4gIEhvZ2FuLnBhcnNlID0gZnVuY3Rpb24odG9rZW5zLCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIGJ1aWxkVHJlZSh0b2tlbnMsICcnLCBbXSwgb3B0aW9ucy5zZWN0aW9uVGFncyB8fCBbXSk7XG4gIH1cblxuICBIb2dhbi5jYWNoZSA9IHt9O1xuXG4gIEhvZ2FuLmNhY2hlS2V5ID0gZnVuY3Rpb24odGV4dCwgb3B0aW9ucykge1xuICAgIHJldHVybiBbdGV4dCwgISFvcHRpb25zLmFzU3RyaW5nLCAhIW9wdGlvbnMuZGlzYWJsZUxhbWJkYSwgb3B0aW9ucy5kZWxpbWl0ZXJzLCAhIW9wdGlvbnMubW9kZWxHZXRdLmpvaW4oJ3x8Jyk7XG4gIH1cblxuICBIb2dhbi5jb21waWxlID0gZnVuY3Rpb24odGV4dCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHZhciBrZXkgPSBIb2dhbi5jYWNoZUtleSh0ZXh0LCBvcHRpb25zKTtcbiAgICB2YXIgdGVtcGxhdGUgPSB0aGlzLmNhY2hlW2tleV07XG5cbiAgICBpZiAodGVtcGxhdGUpIHtcbiAgICAgIHZhciBwYXJ0aWFscyA9IHRlbXBsYXRlLnBhcnRpYWxzO1xuICAgICAgZm9yICh2YXIgbmFtZSBpbiBwYXJ0aWFscykge1xuICAgICAgICBkZWxldGUgcGFydGlhbHNbbmFtZV0uaW5zdGFuY2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgdGVtcGxhdGUgPSB0aGlzLmdlbmVyYXRlKHRoaXMucGFyc2UodGhpcy5zY2FuKHRleHQsIG9wdGlvbnMuZGVsaW1pdGVycyksIHRleHQsIG9wdGlvbnMpLCB0ZXh0LCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZVtrZXldID0gdGVtcGxhdGU7XG4gIH1cbn0pKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJyA/IGV4cG9ydHMgOiBIb2dhbik7XG4iLCIvKlxuICogIENvcHlyaWdodCAyMDExIFR3aXR0ZXIsIEluYy5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8vIFRoaXMgZmlsZSBpcyBmb3IgdXNlIHdpdGggTm9kZS5qcy4gU2VlIGRpc3QvIGZvciBicm93c2VyIGZpbGVzLlxuXG52YXIgSG9nYW4gPSByZXF1aXJlKCcuL2NvbXBpbGVyJyk7XG5Ib2dhbi5UZW1wbGF0ZSA9IHJlcXVpcmUoJy4vdGVtcGxhdGUnKS5UZW1wbGF0ZTtcbkhvZ2FuLnRlbXBsYXRlID0gSG9nYW4uVGVtcGxhdGU7XG5tb2R1bGUuZXhwb3J0cyA9IEhvZ2FuO1xuIiwiLypcbiAqICBDb3B5cmlnaHQgMjAxMSBUd2l0dGVyLCBJbmMuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG52YXIgSG9nYW4gPSB7fTtcblxuKGZ1bmN0aW9uIChIb2dhbikge1xuICBIb2dhbi5UZW1wbGF0ZSA9IGZ1bmN0aW9uIChjb2RlT2JqLCB0ZXh0LCBjb21waWxlciwgb3B0aW9ucykge1xuICAgIGNvZGVPYmogPSBjb2RlT2JqIHx8IHt9O1xuICAgIHRoaXMuciA9IGNvZGVPYmouY29kZSB8fCB0aGlzLnI7XG4gICAgdGhpcy5jID0gY29tcGlsZXI7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLnRleHQgPSB0ZXh0IHx8ICcnO1xuICAgIHRoaXMucGFydGlhbHMgPSBjb2RlT2JqLnBhcnRpYWxzIHx8IHt9O1xuICAgIHRoaXMuc3VicyA9IGNvZGVPYmouc3VicyB8fCB7fTtcbiAgICB0aGlzLmJ1ZiA9ICcnO1xuICB9XG5cbiAgSG9nYW4uVGVtcGxhdGUucHJvdG90eXBlID0ge1xuICAgIC8vIHJlbmRlcjogcmVwbGFjZWQgYnkgZ2VuZXJhdGVkIGNvZGUuXG4gICAgcjogZnVuY3Rpb24gKGNvbnRleHQsIHBhcnRpYWxzLCBpbmRlbnQpIHsgcmV0dXJuICcnOyB9LFxuXG4gICAgLy8gdmFyaWFibGUgZXNjYXBpbmdcbiAgICB2OiBob2dhbkVzY2FwZSxcblxuICAgIC8vIHRyaXBsZSBzdGFjaGVcbiAgICB0OiBjb2VyY2VUb1N0cmluZyxcblxuICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGNvbnRleHQsIHBhcnRpYWxzLCBpbmRlbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJpKFtjb250ZXh0XSwgcGFydGlhbHMgfHwge30sIGluZGVudCk7XG4gICAgfSxcblxuICAgIC8vIHJlbmRlciBpbnRlcm5hbCAtLSBhIGhvb2sgZm9yIG92ZXJyaWRlcyB0aGF0IGNhdGNoZXMgcGFydGlhbHMgdG9vXG4gICAgcmk6IGZ1bmN0aW9uIChjb250ZXh0LCBwYXJ0aWFscywgaW5kZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5yKGNvbnRleHQsIHBhcnRpYWxzLCBpbmRlbnQpO1xuICAgIH0sXG5cbiAgICAvLyBlbnN1cmVQYXJ0aWFsXG4gICAgZXA6IGZ1bmN0aW9uKHN5bWJvbCwgcGFydGlhbHMpIHtcbiAgICAgIHZhciBwYXJ0aWFsID0gdGhpcy5wYXJ0aWFsc1tzeW1ib2xdO1xuXG4gICAgICAvLyBjaGVjayB0byBzZWUgdGhhdCBpZiB3ZSd2ZSBpbnN0YW50aWF0ZWQgdGhpcyBwYXJ0aWFsIGJlZm9yZVxuICAgICAgdmFyIHRlbXBsYXRlID0gcGFydGlhbHNbcGFydGlhbC5uYW1lXTtcbiAgICAgIGlmIChwYXJ0aWFsLmluc3RhbmNlICYmIHBhcnRpYWwuYmFzZSA9PSB0ZW1wbGF0ZSkge1xuICAgICAgICByZXR1cm4gcGFydGlhbC5pbnN0YW5jZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZSA9PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoIXRoaXMuYykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbXBpbGVyIGF2YWlsYWJsZS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgdGVtcGxhdGUgPSB0aGlzLmMuY29tcGlsZSh0ZW1wbGF0ZSwgdGhpcy5vcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0ZW1wbGF0ZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gV2UgdXNlIHRoaXMgdG8gY2hlY2sgd2hldGhlciB0aGUgcGFydGlhbHMgZGljdGlvbmFyeSBoYXMgY2hhbmdlZFxuICAgICAgdGhpcy5wYXJ0aWFsc1tzeW1ib2xdLmJhc2UgPSB0ZW1wbGF0ZTtcblxuICAgICAgaWYgKHBhcnRpYWwuc3Vicykge1xuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY29uc2lkZXIgcGFyZW50IHRlbXBsYXRlIG5vd1xuICAgICAgICBpZiAoIXBhcnRpYWxzLnN0YWNrVGV4dCkgcGFydGlhbHMuc3RhY2tUZXh0ID0ge307XG4gICAgICAgIGZvciAoa2V5IGluIHBhcnRpYWwuc3Vicykge1xuICAgICAgICAgIGlmICghcGFydGlhbHMuc3RhY2tUZXh0W2tleV0pIHtcbiAgICAgICAgICAgIHBhcnRpYWxzLnN0YWNrVGV4dFtrZXldID0gKHRoaXMuYWN0aXZlU3ViICE9PSB1bmRlZmluZWQgJiYgcGFydGlhbHMuc3RhY2tUZXh0W3RoaXMuYWN0aXZlU3ViXSkgPyBwYXJ0aWFscy5zdGFja1RleHRbdGhpcy5hY3RpdmVTdWJdIDogdGhpcy50ZXh0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0ZW1wbGF0ZSA9IGNyZWF0ZVNwZWNpYWxpemVkUGFydGlhbCh0ZW1wbGF0ZSwgcGFydGlhbC5zdWJzLCBwYXJ0aWFsLnBhcnRpYWxzLFxuICAgICAgICAgIHRoaXMuc3RhY2tTdWJzLCB0aGlzLnN0YWNrUGFydGlhbHMsIHBhcnRpYWxzLnN0YWNrVGV4dCk7XG4gICAgICB9XG4gICAgICB0aGlzLnBhcnRpYWxzW3N5bWJvbF0uaW5zdGFuY2UgPSB0ZW1wbGF0ZTtcblxuICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgIH0sXG5cbiAgICAvLyB0cmllcyB0byBmaW5kIGEgcGFydGlhbCBpbiB0aGUgY3VycmVudCBzY29wZSBhbmQgcmVuZGVyIGl0XG4gICAgcnA6IGZ1bmN0aW9uKHN5bWJvbCwgY29udGV4dCwgcGFydGlhbHMsIGluZGVudCkge1xuICAgICAgdmFyIHBhcnRpYWwgPSB0aGlzLmVwKHN5bWJvbCwgcGFydGlhbHMpO1xuICAgICAgaWYgKCFwYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnRpYWwucmkoY29udGV4dCwgcGFydGlhbHMsIGluZGVudCk7XG4gICAgfSxcblxuICAgIC8vIHJlbmRlciBhIHNlY3Rpb25cbiAgICByczogZnVuY3Rpb24oY29udGV4dCwgcGFydGlhbHMsIHNlY3Rpb24pIHtcbiAgICAgIHZhciB0YWlsID0gY29udGV4dFtjb250ZXh0Lmxlbmd0aCAtIDFdO1xuXG4gICAgICBpZiAoIWlzQXJyYXkodGFpbCkpIHtcbiAgICAgICAgc2VjdGlvbihjb250ZXh0LCBwYXJ0aWFscywgdGhpcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWlsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnRleHQucHVzaCh0YWlsW2ldKTtcbiAgICAgICAgc2VjdGlvbihjb250ZXh0LCBwYXJ0aWFscywgdGhpcyk7XG4gICAgICAgIGNvbnRleHQucG9wKCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIG1heWJlIHN0YXJ0IGEgc2VjdGlvblxuICAgIHM6IGZ1bmN0aW9uKHZhbCwgY3R4LCBwYXJ0aWFscywgaW52ZXJ0ZWQsIHN0YXJ0LCBlbmQsIHRhZ3MpIHtcbiAgICAgIHZhciBwYXNzO1xuXG4gICAgICBpZiAoaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbCA9IHRoaXMubXModmFsLCBjdHgsIHBhcnRpYWxzLCBpbnZlcnRlZCwgc3RhcnQsIGVuZCwgdGFncyk7XG4gICAgICB9XG5cbiAgICAgIHBhc3MgPSAhIXZhbDtcblxuICAgICAgaWYgKCFpbnZlcnRlZCAmJiBwYXNzICYmIGN0eCkge1xuICAgICAgICBjdHgucHVzaCgodHlwZW9mIHZhbCA9PSAnb2JqZWN0JykgPyB2YWwgOiBjdHhbY3R4Lmxlbmd0aCAtIDFdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhc3M7XG4gICAgfSxcblxuICAgIC8vIGZpbmQgdmFsdWVzIHdpdGggZG90dGVkIG5hbWVzXG4gICAgZDogZnVuY3Rpb24oa2V5LCBjdHgsIHBhcnRpYWxzLCByZXR1cm5Gb3VuZCkge1xuICAgICAgdmFyIGZvdW5kLFxuICAgICAgICAgIG5hbWVzID0ga2V5LnNwbGl0KCcuJyksXG4gICAgICAgICAgdmFsID0gdGhpcy5mKG5hbWVzWzBdLCBjdHgsIHBhcnRpYWxzLCByZXR1cm5Gb3VuZCksXG4gICAgICAgICAgZG9Nb2RlbEdldCA9IHRoaXMub3B0aW9ucy5tb2RlbEdldCxcbiAgICAgICAgICBjeCA9IG51bGw7XG5cbiAgICAgIGlmIChrZXkgPT09ICcuJyAmJiBpc0FycmF5KGN0eFtjdHgubGVuZ3RoIC0gMl0pKSB7XG4gICAgICAgIHZhbCA9IGN0eFtjdHgubGVuZ3RoIC0gMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgZm91bmQgPSBmaW5kSW5TY29wZShuYW1lc1tpXSwgdmFsLCBkb01vZGVsR2V0KTtcbiAgICAgICAgICBpZiAoZm91bmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY3ggPSB2YWw7XG4gICAgICAgICAgICB2YWwgPSBmb3VuZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXR1cm5Gb3VuZCAmJiAhdmFsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXR1cm5Gb3VuZCAmJiB0eXBlb2YgdmFsID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY3R4LnB1c2goY3gpO1xuICAgICAgICB2YWwgPSB0aGlzLm12KHZhbCwgY3R4LCBwYXJ0aWFscyk7XG4gICAgICAgIGN0eC5wb3AoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgLy8gZmluZCB2YWx1ZXMgd2l0aCBub3JtYWwgbmFtZXNcbiAgICBmOiBmdW5jdGlvbihrZXksIGN0eCwgcGFydGlhbHMsIHJldHVybkZvdW5kKSB7XG4gICAgICB2YXIgdmFsID0gZmFsc2UsXG4gICAgICAgICAgdiA9IG51bGwsXG4gICAgICAgICAgZm91bmQgPSBmYWxzZSxcbiAgICAgICAgICBkb01vZGVsR2V0ID0gdGhpcy5vcHRpb25zLm1vZGVsR2V0O1xuXG4gICAgICBmb3IgKHZhciBpID0gY3R4Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHYgPSBjdHhbaV07XG4gICAgICAgIHZhbCA9IGZpbmRJblNjb3BlKGtleSwgdiwgZG9Nb2RlbEdldCk7XG4gICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgIHJldHVybiAocmV0dXJuRm91bmQpID8gZmFsc2UgOiBcIlwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJldHVybkZvdW5kICYmIHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWwgPSB0aGlzLm12KHZhbCwgY3R4LCBwYXJ0aWFscyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIC8vIGhpZ2hlciBvcmRlciB0ZW1wbGF0ZXNcbiAgICBsczogZnVuY3Rpb24oZnVuYywgY3gsIHBhcnRpYWxzLCB0ZXh0LCB0YWdzKSB7XG4gICAgICB2YXIgb2xkVGFncyA9IHRoaXMub3B0aW9ucy5kZWxpbWl0ZXJzO1xuXG4gICAgICB0aGlzLm9wdGlvbnMuZGVsaW1pdGVycyA9IHRhZ3M7XG4gICAgICB0aGlzLmIodGhpcy5jdChjb2VyY2VUb1N0cmluZyhmdW5jLmNhbGwoY3gsIHRleHQpKSwgY3gsIHBhcnRpYWxzKSk7XG4gICAgICB0aGlzLm9wdGlvbnMuZGVsaW1pdGVycyA9IG9sZFRhZ3M7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLy8gY29tcGlsZSB0ZXh0XG4gICAgY3Q6IGZ1bmN0aW9uKHRleHQsIGN4LCBwYXJ0aWFscykge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlTGFtYmRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTGFtYmRhIGZlYXR1cmVzIGRpc2FibGVkLicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYy5jb21waWxlKHRleHQsIHRoaXMub3B0aW9ucykucmVuZGVyKGN4LCBwYXJ0aWFscyk7XG4gICAgfSxcblxuICAgIC8vIHRlbXBsYXRlIHJlc3VsdCBidWZmZXJpbmdcbiAgICBiOiBmdW5jdGlvbihzKSB7IHRoaXMuYnVmICs9IHM7IH0sXG5cbiAgICBmbDogZnVuY3Rpb24oKSB7IHZhciByID0gdGhpcy5idWY7IHRoaXMuYnVmID0gJyc7IHJldHVybiByOyB9LFxuXG4gICAgLy8gbWV0aG9kIHJlcGxhY2Ugc2VjdGlvblxuICAgIG1zOiBmdW5jdGlvbihmdW5jLCBjdHgsIHBhcnRpYWxzLCBpbnZlcnRlZCwgc3RhcnQsIGVuZCwgdGFncykge1xuICAgICAgdmFyIHRleHRTb3VyY2UsXG4gICAgICAgICAgY3ggPSBjdHhbY3R4Lmxlbmd0aCAtIDFdLFxuICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuY2FsbChjeCk7XG5cbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKGludmVydGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGV4dFNvdXJjZSA9ICh0aGlzLmFjdGl2ZVN1YiAmJiB0aGlzLnN1YnNUZXh0ICYmIHRoaXMuc3Vic1RleHRbdGhpcy5hY3RpdmVTdWJdKSA/IHRoaXMuc3Vic1RleHRbdGhpcy5hY3RpdmVTdWJdIDogdGhpcy50ZXh0O1xuICAgICAgICAgIHJldHVybiB0aGlzLmxzKHJlc3VsdCwgY3gsIHBhcnRpYWxzLCB0ZXh0U291cmNlLnN1YnN0cmluZyhzdGFydCwgZW5kKSwgdGFncyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgLy8gbWV0aG9kIHJlcGxhY2UgdmFyaWFibGVcbiAgICBtdjogZnVuY3Rpb24oZnVuYywgY3R4LCBwYXJ0aWFscykge1xuICAgICAgdmFyIGN4ID0gY3R4W2N0eC5sZW5ndGggLSAxXTtcbiAgICAgIHZhciByZXN1bHQgPSBmdW5jLmNhbGwoY3gpO1xuXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0KGNvZXJjZVRvU3RyaW5nKHJlc3VsdC5jYWxsKGN4KSksIGN4LCBwYXJ0aWFscyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIHN1YjogZnVuY3Rpb24obmFtZSwgY29udGV4dCwgcGFydGlhbHMsIGluZGVudCkge1xuICAgICAgdmFyIGYgPSB0aGlzLnN1YnNbbmFtZV07XG4gICAgICBpZiAoZikge1xuICAgICAgICB0aGlzLmFjdGl2ZVN1YiA9IG5hbWU7XG4gICAgICAgIGYoY29udGV4dCwgcGFydGlhbHMsIHRoaXMsIGluZGVudCk7XG4gICAgICAgIHRoaXMuYWN0aXZlU3ViID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gIH07XG5cbiAgLy9GaW5kIGEga2V5IGluIGFuIG9iamVjdFxuICBmdW5jdGlvbiBmaW5kSW5TY29wZShrZXksIHNjb3BlLCBkb01vZGVsR2V0KSB7XG4gICAgdmFyIHZhbDtcblxuICAgIGlmIChzY29wZSAmJiB0eXBlb2Ygc2NvcGUgPT0gJ29iamVjdCcpIHtcblxuICAgICAgaWYgKHNjb3BlW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWwgPSBzY29wZVtrZXldO1xuXG4gICAgICAvLyB0cnkgbG9va3VwIHdpdGggZ2V0IGZvciBiYWNrYm9uZSBvciBzaW1pbGFyIG1vZGVsIGRhdGFcbiAgICAgIH0gZWxzZSBpZiAoZG9Nb2RlbEdldCAmJiBzY29wZS5nZXQgJiYgdHlwZW9mIHNjb3BlLmdldCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbCA9IHNjb3BlLmdldChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTcGVjaWFsaXplZFBhcnRpYWwoaW5zdGFuY2UsIHN1YnMsIHBhcnRpYWxzLCBzdGFja1N1YnMsIHN0YWNrUGFydGlhbHMsIHN0YWNrVGV4dCkge1xuICAgIGZ1bmN0aW9uIFBhcnRpYWxUZW1wbGF0ZSgpIHt9O1xuICAgIFBhcnRpYWxUZW1wbGF0ZS5wcm90b3R5cGUgPSBpbnN0YW5jZTtcbiAgICBmdW5jdGlvbiBTdWJzdGl0dXRpb25zKCkge307XG4gICAgU3Vic3RpdHV0aW9ucy5wcm90b3R5cGUgPSBpbnN0YW5jZS5zdWJzO1xuICAgIHZhciBrZXk7XG4gICAgdmFyIHBhcnRpYWwgPSBuZXcgUGFydGlhbFRlbXBsYXRlKCk7XG4gICAgcGFydGlhbC5zdWJzID0gbmV3IFN1YnN0aXR1dGlvbnMoKTtcbiAgICBwYXJ0aWFsLnN1YnNUZXh0ID0ge307ICAvL2hlaGUuIHN1YnN0ZXh0LlxuICAgIHBhcnRpYWwuYnVmID0gJyc7XG5cbiAgICBzdGFja1N1YnMgPSBzdGFja1N1YnMgfHwge307XG4gICAgcGFydGlhbC5zdGFja1N1YnMgPSBzdGFja1N1YnM7XG4gICAgcGFydGlhbC5zdWJzVGV4dCA9IHN0YWNrVGV4dDtcbiAgICBmb3IgKGtleSBpbiBzdWJzKSB7XG4gICAgICBpZiAoIXN0YWNrU3Vic1trZXldKSBzdGFja1N1YnNba2V5XSA9IHN1YnNba2V5XTtcbiAgICB9XG4gICAgZm9yIChrZXkgaW4gc3RhY2tTdWJzKSB7XG4gICAgICBwYXJ0aWFsLnN1YnNba2V5XSA9IHN0YWNrU3Vic1trZXldO1xuICAgIH1cblxuICAgIHN0YWNrUGFydGlhbHMgPSBzdGFja1BhcnRpYWxzIHx8IHt9O1xuICAgIHBhcnRpYWwuc3RhY2tQYXJ0aWFscyA9IHN0YWNrUGFydGlhbHM7XG4gICAgZm9yIChrZXkgaW4gcGFydGlhbHMpIHtcbiAgICAgIGlmICghc3RhY2tQYXJ0aWFsc1trZXldKSBzdGFja1BhcnRpYWxzW2tleV0gPSBwYXJ0aWFsc1trZXldO1xuICAgIH1cbiAgICBmb3IgKGtleSBpbiBzdGFja1BhcnRpYWxzKSB7XG4gICAgICBwYXJ0aWFsLnBhcnRpYWxzW2tleV0gPSBzdGFja1BhcnRpYWxzW2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRpYWw7XG4gIH1cblxuICB2YXIgckFtcCA9IC8mL2csXG4gICAgICByTHQgPSAvPC9nLFxuICAgICAgckd0ID0gLz4vZyxcbiAgICAgIHJBcG9zID0gL1xcJy9nLFxuICAgICAgclF1b3QgPSAvXFxcIi9nLFxuICAgICAgaENoYXJzID0gL1smPD5cXFwiXFwnXS87XG5cbiAgZnVuY3Rpb24gY29lcmNlVG9TdHJpbmcodmFsKSB7XG4gICAgcmV0dXJuIFN0cmluZygodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSA/ICcnIDogdmFsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhvZ2FuRXNjYXBlKHN0cikge1xuICAgIHN0ciA9IGNvZXJjZVRvU3RyaW5nKHN0cik7XG4gICAgcmV0dXJuIGhDaGFycy50ZXN0KHN0cikgP1xuICAgICAgc3RyXG4gICAgICAgIC5yZXBsYWNlKHJBbXAsICcmYW1wOycpXG4gICAgICAgIC5yZXBsYWNlKHJMdCwgJyZsdDsnKVxuICAgICAgICAucmVwbGFjZShyR3QsICcmZ3Q7JylcbiAgICAgICAgLnJlcGxhY2UockFwb3MsICcmIzM5OycpXG4gICAgICAgIC5yZXBsYWNlKHJRdW90LCAnJnF1b3Q7JykgOlxuICAgICAgc3RyO1xuICB9XG5cbiAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKGEpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpID09PSAnW29iamVjdCBBcnJheV0nO1xuICB9O1xuXG59KSh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcgPyBleHBvcnRzIDogSG9nYW4pO1xuIiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8YSBpZD1cXFwiXCIpO3QuYih0LnYodC5mKFwiaWRcIixjLHAsMCkpKTt0LmIoXCJcXFwiIGNsYXNzPVxcXCJjYXJvdXNlbC1uZXdzIGNhcm91c2VsLWVlXFxcIiBocmVmPVxcXCJcIik7dC5iKHQudih0LmYoXCJocmVmXCIsYyxwLDApKSk7dC5iKFwiXFxcIiBcIik7aWYodC5zKHQuZihcImhyZWZcIixjLHAsMSksYyxwLDAsNzQsOTEsXCJ7eyB9fVwiKSl7dC5ycyhjLHAsZnVuY3Rpb24oYyxwLHQpe3QuYihcIiB0YXJnZXQ9XFxcIl9ibGFua1xcXCIgXCIpO30pO2MucG9wKCk7fXQuYihcIiBzdHlsZT1cXFwiYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiKTt0LmIodC52KHQuZihcImJhY2tncm91bmRJbWFnZVwiLGMscCwwKSkpO3QuYihcIilcXFwiPjxkaXY+PGg0PlwiKTt0LmIodC52KHQuZihcImg0XCIsYyxwLDApKSk7dC5iKFwiPC9oND48aDU+XCIpO3QuYih0LnYodC5mKFwiaDVcIixjLHAsMCkpKTt0LmIoXCI8L2g1PjxwPlwiKTt0LmIodC52KHQuZihcInBcIixjLHAsMCkpKTt0LmIoXCI8L3A+PC9kaXY+PC9hPlwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGEgaWQ9XFxcInt7aWR9fVxcXCIgY2xhc3M9XFxcImNhcm91c2VsLW5ld3MgY2Fyb3VzZWwtZWVcXFwiIGhyZWY9XFxcInt7aHJlZn19XFxcIiB7eyNocmVmfX0gdGFyZ2V0PVxcXCJfYmxhbmtcXFwiIHt7L2hyZWZ9fSBzdHlsZT1cXFwiYmFja2dyb3VuZC1pbWFnZTogdXJsKHt7YmFja2dyb3VuZEltYWdlfX0pXFxcIj48ZGl2PjxoND57e2g0fX08L2g0PjxoNT57e2g1fX08L2g1PjxwPnt7cH19PC9wPjwvZGl2PjwvYT5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxidXR0b24gaWQ9XFxcIlwiKTt0LmIodC52KHQuZihcImlkXCIsYyxwLDApKSk7dC5iKFwiXFxcIiBjbGFzcz1cXFwibmwtYnV0dG9uIGZhdm9yaXRlcy1hY3Rpb24tZWVcXFwiPiBcIik7dC5iKHQudih0LmYoXCJ0ZXh0XCIsYyxwLDApKSk7dC5iKFwiIDwvYnV0dG9uPlwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGJ1dHRvbiBpZD1cXFwie3tpZH19XFxcIiBjbGFzcz1cXFwibmwtYnV0dG9uIGZhdm9yaXRlcy1hY3Rpb24tZWVcXFwiPiB7e3RleHR9fSA8L2J1dHRvbj5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxhIGNsYXNzPVxcXCJob21lLWNvbnRlbnQtdGlsZSBob21lLWNvbnRlbnQtc21hbGwgaG9tZS1jb250ZW50LXNtYWxsLWVlXFxcIiBpZD1cXFwiaG9tZS1cIik7dC5iKHQudih0LmYoXCJpZFwiLGMscCwwKSkpO3QuYihcIlxcXCIgaHJlZj1cXFwiXCIpO3QuYih0LnYodC5mKFwiaHJlZlwiLGMscCwwKSkpO3QuYihcIlxcXCIgc3R5bGU9XFxcImJhY2tncm91bmQtaW1hZ2U6IHVybChcIik7dC5iKHQudih0LmYoXCJiYWNrZ3JvdW5kSW1hZ2VcIixjLHAsMCkpKTt0LmIoXCIpO1xcXCI+PGg0PlwiKTt0LmIodC52KHQuZihcImg0XCIsYyxwLDApKSk7dC5iKFwiPC9oND48L2E+XCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8YSBjbGFzcz1cXFwiaG9tZS1jb250ZW50LXRpbGUgaG9tZS1jb250ZW50LXNtYWxsIGhvbWUtY29udGVudC1zbWFsbC1lZVxcXCIgaWQ9XFxcImhvbWUte3tpZH19XFxcIiBocmVmPVxcXCJ7e2hyZWZ9fVxcXCIgc3R5bGU9XFxcImJhY2tncm91bmQtaW1hZ2U6IHVybCh7e2JhY2tncm91bmRJbWFnZX19KTtcXFwiPjxoND57e2g0fX08L2g0PjwvYT5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxsaSBjbGFzcz1cXFwibWFpbi1tZW51LVwiKTt0LmIodC52KHQuZihcImNsYXNzXCIsYyxwLDApKSk7dC5iKFwiIG1haW4tbWVudS1lZVxcXCI+PGEgaHJlZj1cXFwiXCIpO3QuYih0LnYodC5mKFwiaHJlZlwiLGMscCwwKSkpO3QuYihcIlxcXCI+XCIpO3QuYih0LnYodC5mKFwidGV4dFwiLGMscCwwKSkpO3QuYihcIjwvYT48L2xpPlwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGxpIGNsYXNzPVxcXCJtYWluLW1lbnUte3tjbGFzc319IG1haW4tbWVudS1lZVxcXCI+PGEgaHJlZj1cXFwie3tocmVmfX1cXFwiPnt7dGV4dH19PC9hPjwvbGk+XCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8bGkgaWQ9XFxcIlwiKTt0LmIodC52KHQuZihcImlkXCIsYyxwLDApKSk7dC5iKFwiXFxcIiBjbGFzcz1cXFwicHJvZmlsZS1jb250YWN0LWFjdGlvbi1lZVxcXCI+PHNwYW4gY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc21cXFwiPjxkaXYgY2xhc3M9XFxcImFjdGlvbi1kZXNjcmlwdGlvblxcXCI+XCIpO3QuYih0LnYodC5mKFwiYWN0aW9uRGVzY3JpcHRpb25cIixjLHAsMCkpKTt0LmIoXCI8L2Rpdj48L3NwYW4+PC9saT5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxsaSBpZD1cXFwie3tpZH19XFxcIiBjbGFzcz1cXFwicHJvZmlsZS1jb250YWN0LWFjdGlvbi1lZVxcXCI+PHNwYW4gY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc21cXFwiPjxkaXYgY2xhc3M9XFxcImFjdGlvbi1kZXNjcmlwdGlvblxcXCI+e3thY3Rpb25EZXNjcmlwdGlvbn19PC9kaXY+PC9zcGFuPjwvbGk+XCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8ZGl2IGNsYXNzPVxcXCJhY2NvdW50LW1pc2MtYmxvYyBhY2NvdW50LWVlLWJsb2MgYmxvY1xcXCI+PGgyIGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj5FbmhhbmNlbWVudHM8L2gyPjx1bCBjbGFzcz1cXFwiYWNjb3VudC1taXNjLWFjdGlvbnNcXFwiPjxsaSBpZD1cXFwiZWUtbWluaWdhbWVzLWVuYWJsZWRcXFwiIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtIFwiKTtpZih0LnModC5mKFwibWluaWdhbWVzXCIsYyxwLDEpLGMscCwwLDIwMiwyMDgsXCJ7eyB9fVwiKSl7dC5ycyhjLHAsZnVuY3Rpb24oYyxwLHQpe3QuYihcImFjdGl2ZVwiKTt9KTtjLnBvcCgpO310LmIoXCJcXFwiPk1pbmlnYW1lczwvbGk+PGxpIGlkPVxcXCJlZS1leHBsb3JhdGlvbnMtZW5hYmxlZFxcXCIgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc20gXCIpO2lmKHQucyh0LmYoXCJleHBsb3JhdGlvbnNcIixjLHAsMSksYyxwLDAsMzE4LDMyNCxcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiYWN0aXZlXCIpO30pO2MucG9wKCk7fXQuYihcIiBkaXNhYmxlZFxcXCI+RXhwbG9yYXRpb25zPC9saT48bGkgaWQ9XFxcImVlLW1hcmtldC1lbmFibGVkXFxcIiBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbSBcIik7aWYodC5zKHQuZihcIm1hcmtldFwiLGMscCwxKSxjLHAsMCw0MzcsNDQzLFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCJhY3RpdmVcIik7fSk7Yy5wb3AoKTt9dC5iKFwiIGRpc2FibGVkXFxcIj5NYXJrZXQ8L2xpPjwvdWw+PC9kaXY+XCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8ZGl2IGNsYXNzPVxcXCJhY2NvdW50LW1pc2MtYmxvYyBhY2NvdW50LWVlLWJsb2MgYmxvY1xcXCI+PGgyIGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj5FbmhhbmNlbWVudHM8L2gyPjx1bCBjbGFzcz1cXFwiYWNjb3VudC1taXNjLWFjdGlvbnNcXFwiPjxsaSBpZD1cXFwiZWUtbWluaWdhbWVzLWVuYWJsZWRcXFwiIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtIHt7I21pbmlnYW1lc319YWN0aXZle3svbWluaWdhbWVzfX1cXFwiPk1pbmlnYW1lczwvbGk+PGxpIGlkPVxcXCJlZS1leHBsb3JhdGlvbnMtZW5hYmxlZFxcXCIgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc20ge3sjZXhwbG9yYXRpb25zfX1hY3RpdmV7ey9leHBsb3JhdGlvbnN9fSBkaXNhYmxlZFxcXCI+RXhwbG9yYXRpb25zPC9saT48bGkgaWQ9XFxcImVlLW1hcmtldC1lbmFibGVkXFxcIiBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbSB7eyNtYXJrZXR9fWFjdGl2ZXt7L21hcmtldH19IGRpc2FibGVkXFxcIj5NYXJrZXQ8L2xpPjwvdWw+PC9kaXY+XCIsIEgpO3JldHVybiBUOyB9KCk7IiwiaW1wb3J0IHR5cGUgeyBJdGVtIH0gZnJvbSBcIi4uL2VsZGFyeWEvaXRlbVwiO1xuaW1wb3J0IHsgZXhwb3J0T3V0Zml0IH0gZnJvbSBcIi4uL291dGZpdFwiO1xuaW1wb3J0IHR5cGUgeyBQYXJzYWJsZUl0ZW0gfSBmcm9tIFwiLi9pbnRlcmZhY2VzL3BhcnNhYmxlX2l0ZW1cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydFByZXZpZXcoKTogdm9pZCB7XG4gIGV4cG9ydE91dGZpdChcIiNhcHBlYXJhbmNlLXByZXZpZXdcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbXBvcnRPdXRmaXQoKTogdm9pZCB7XG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiZmlsZVwiKTtcbiAgaW5wdXQuc2V0QXR0cmlidXRlKFwiYWNjZXB0XCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgaW5wdXQuY2xpY2soKTtcblxuICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgKGV2ZW50KSA9PiB7XG4gICAgaWYgKCFldmVudC50YXJnZXQpIHJldHVybjtcbiAgICBjb25zdCBmaWxlcyA9ICg8SFRNTElucHV0RWxlbWVudD5ldmVudC50YXJnZXQpLmZpbGVzO1xuICAgIGlmICghZmlsZXMpIHJldHVybjtcbiAgICBjb25zdCBmaWxlID0gZmlsZXNbMF07XG4gICAgaWYgKCFmaWxlKSByZXR1cm47XG4gICAgdm9pZCBmaWxlLnRleHQoKS50aGVuKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBvdXRmaXQ6IFBhcnNhYmxlSXRlbVtdID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICBjb25zdCBhdmF0YXIgPSBTYWNoYS5BdmF0YXIuYXZhdGFyc1tcIiNhcHBlYXJhbmNlLXByZXZpZXdcIl07XG4gICAgICBpZiAoIWF2YXRhcikgcmV0dXJuO1xuXG4gICAgICAkLmZsYXZyTm90aWYoXCJJbXBvcnRpbmcgb3V0Zml0LiBQbGVhc2Ugd2FpdC4uLlwiKTtcblxuICAgICAgLy8gR2V0IGFsbCBjYXRlZ29yaWVzXG4gICAgICBjb25zdCBjYXRlZ29yaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IGNsb3RoaW5nIG9mIG91dGZpdCkge1xuICAgICAgICBjYXRlZ29yaWVzLmFkZChjbG90aGluZy50eXBlKTtcbiAgICAgIH1cblxuICAgICAgLy8gT3BlbiBhbGwgY2F0ZWdvcmllc1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIEFycmF5LmZyb20oY2F0ZWdvcmllcy52YWx1ZXMoKSkubWFwKGFzeW5jIChjYXRlZ29yeSkgPT5cbiAgICAgICAgICBvcGVuQ2F0ZWdvcnkoY2F0ZWdvcnkpXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICAgIC8vIEdldCBhbGwgZ3JvdXBzXG4gICAgICBjb25zdCBncm91cHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAgIGZvciAoY29uc3QgY2xvdGhpbmcgb2Ygb3V0Zml0KSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ncm91cD1cIiR7Y2xvdGhpbmcuZ3JvdXB9XCJdYCkpXG4gICAgICAgICAgZ3JvdXBzLmFkZChjbG90aGluZy5ncm91cCk7XG4gICAgICB9XG5cbiAgICAgIC8vIE9wZW4gYWxsIGdyb3Vwc1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIEFycmF5LmZyb20oZ3JvdXBzLnZhbHVlcygpKS5tYXAoYXN5bmMgKGdyb3VwKSA9PiBvcGVuR3JvdXAoZ3JvdXApKVxuICAgICAgKTtcblxuICAgICAgLy8gR2V0IHRoZSBpdGVtcyBmcm9tIGBhdmFpbGFibGVJdGVtc2BcbiAgICAgIGNvbnN0IHdvcm5JdGVtczogSXRlbVtdID0gW107XG4gICAgICBvdXRmaXQuZm9yRWFjaCgoY2xvdGhpbmcpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGF2YWlsYWJsZUl0ZW1zW2Nsb3RoaW5nLmlkXTtcbiAgICAgICAgaWYgKGl0ZW0pIHdvcm5JdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJlbW92ZUNsb3RoZXMoKTtcbiAgICAgIGF2YXRhci5hZGRJdGVtcyh3b3JuSXRlbXMpO1xuICAgICAgaW5pdGlhbGl6ZVNlbGVjdGVkSXRlbXMoKTtcbiAgICAgIGluaXRpYWxpemVIaWRkZW5DYXRlZ29yaWVzKCk7XG5cbiAgICAgICQuZmxhdnJOb3RpZihcIkltcG9ydGVkIG91dGZpdCFcIik7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVDbG90aGVzKCkge1xuICBjb25zdCBhdmF0YXIgPSBTYWNoYS5BdmF0YXIuYXZhdGFyc1tcIiNhcHBlYXJhbmNlLXByZXZpZXdcIl07XG4gIGlmICghYXZhdGFyKSByZXR1cm47XG5cbiAgZm9yIChsZXQgaSA9IGF2YXRhci5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IGl0ZW1SZW5kZXIgPSBhdmF0YXIuY2hpbGRyZW5baV07XG4gICAgaWYgKCFpdGVtUmVuZGVyKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGl0ZW0gPSBpdGVtUmVuZGVyLmdldEl0ZW0oKTtcbiAgICBpZiAoU2FjaGEuQXZhdGFyLnJlbW92ZUl0ZW1Gcm9tQWxsQXZhdGFycyhpdGVtKSkge1xuICAgICAgJChgI2FwcGVhcmFuY2UtaXRlbS0ke2l0ZW0uX2lkfWApLnJlbW92ZUNsYXNzKFwic2VsZWN0ZWRcIik7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5Hcm91cChncm91cDogbnVtYmVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGNhdGVnb3J5Q29udGFpbmVyID0gJChcIiNhcHBlYXJhbmNlLWl0ZW1zLWdyb3VwLVwiICsgZ3JvdXAudG9TdHJpbmcoKSk7XG4gICAgaWYgKGNhdGVnb3J5Q29udGFpbmVyLmhhc0NsYXNzKFwiYWN0aXZlXCIpKSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNhdGVnb3J5Q29udGFpbmVyLmxlbmd0aCA8PSAwKSB7XG4gICAgICB2b2lkICQuZ2V0KFxuICAgICAgICBcIi9wbGF5ZXIvb3Blbkdyb3VwL1wiICsgZ3JvdXAudG9TdHJpbmcoKSxcbiAgICAgICAgZnVuY3Rpb24gKHZpZXc6IHN0cmluZykge1xuICAgICAgICAgICQodmlldykuaGlkZSgpLmFwcGVuZFRvKFwiI2FwcGVhcmFuY2UtaXRlbXNcIik7XG4gICAgICAgIH1cbiAgICAgICkuYWx3YXlzKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBvcGVuQ2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZykge1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBjYXRlZ29yeUNvbnRhaW5lciA9ICQoXCIjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS1cIiArIGNhdGVnb3J5KTtcbiAgICBpZiAoY2F0ZWdvcnlDb250YWluZXIuaGFzQ2xhc3MoXCJhY3RpdmVcIikpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2F0ZWdvcnlDb250YWluZXIubGVuZ3RoIDw9IDApIHtcbiAgICAgIHZvaWQgJC5wb3N0KFwiL3BsYXllci9vcGVuQ2F0ZWdvcnkvXCIgKyBjYXRlZ29yeSwgZnVuY3Rpb24gKHZpZXc6IHN0cmluZykge1xuICAgICAgICAkKHZpZXcpLmhpZGUoKS5hcHBlbmRUbyhcIiNhcHBlYXJhbmNlLWl0ZW1zXCIpO1xuICAgICAgfSkuYWx3YXlzKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBDYXJvdXNlbE5ld3MgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvY2Fyb3VzZWxfbmV3c1wiO1xuXG5leHBvcnQgY29uc3QgY2Fyb3VzZWxCZWVtb292QW5ub3lhbmNlczogQ2Fyb3VzZWxOZXdzID0ge1xuICBiYWNrZ3JvdW5kSW1hZ2U6XG4gICAgXCJodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9hdHRhY2htZW50cy8xNjE2MzY4NTY0ODI0OTY1MjIvODQyOTY0MjM2MjA0NTA3MjE2L2Nhcm91c2VsX2JlZW1vb3ZfYW5ub3lhbmNlcy5wbmdcIixcbiAgaDQ6IFwiQmVlbW9vdiBBbm5veWFuY2VzXCIsXG4gIGhyZWY6IFwiaHR0cHM6Ly9naXRsYWIuY29tL05hdG9Cb3JhbS9CZWVtb292LUFubm95YW5jZXNcIixcbiAgaWQ6IFwiY2Fyb3VzZWwtYmVlbW9vdi1hbm5veWFuY2VzXCIsXG4gIHA6IFwiQmxvY2sgc29tZSBvZiBFbGRhcnlhJ3MgYW5ub3lhbmNlcy5cIixcbn07XG4iLCJpbXBvcnQgdHlwZSB7IENhcm91c2VsTmV3cyB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9jYXJvdXNlbF9uZXdzXCI7XG5cbmV4cG9ydCBjb25zdCBjYXJvdXNlbERvd25sb2FkRmFjZTogQ2Fyb3VzZWxOZXdzID0ge1xuICBiYWNrZ3JvdW5kSW1hZ2U6XG4gICAgXCJodHRwczovL2dpdGxhYi5jb20vTmF0b0JvcmFtL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy0vcmF3L21hc3Rlci9pbWFnZXMvY2Fyb3VzZWxfZG93bmxvYWRfZmFjZS5wbmdcIixcbiAgaWQ6IFwiY2Fyb3VzZWwtZG93bmxvYWQtZmFjZVwiLFxuICBoNDogXCJEb3dubG9hZCB5b3VyIGZhY2UhXCIsXG4gIHA6IFwiQ2xpY2sgaGVyZSB0byBkb3dubG9hZCB5b3VyIGd1YXJkaWFuJ3MgZmFjZS5cIixcbn07XG4iLCJpbXBvcnQgdHlwZSB7IENhcm91c2VsTmV3cyB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9jYXJvdXNlbF9uZXdzXCI7XG5cbmV4cG9ydCBjb25zdCBjYXJvdXNlbERvd25sb2FkR3VhcmRpYW46IENhcm91c2VsTmV3cyA9IHtcbiAgYmFja2dyb3VuZEltYWdlOlxuICAgIFwiaHR0cHM6Ly9naXRsYWIuY29tL05hdG9Cb3JhbS9lbGRhcnlhLWVuaGFuY2VtZW50cy8tL3Jhdy9tYXN0ZXIvaW1hZ2VzL2Nhcm91c2VsX2Rvd25sb2FkX2d1YXJkaWFuLnBuZ1wiLFxuICBpZDogXCJjYXJvdXNlbC1kb3dubG9hZC1ndWFyZGlhblwiLFxuICBoNDogXCJEb3dubG9hZCB5b3VyIGd1YXJkaWFuIVwiLFxuICBwOiBcIkNsaWNrIGhlcmUgdG8gZG93bmxvYWQgeW91ciBndWFyZGlhbi5cIixcbn07XG4iLCJpbXBvcnQgdHlwZSB7IENhcm91c2VsTmV3cyB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9jYXJvdXNlbF9uZXdzXCI7XG5cbmV4cG9ydCBjb25zdCBjYXJvdXNlbEVFOiBDYXJvdXNlbE5ld3MgPSB7XG4gIGJhY2tncm91bmRJbWFnZTpcbiAgICBcImh0dHBzOi8vZ2l0bGFiLmNvbS9OYXRvQm9yYW0vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLS9yYXcvbWFzdGVyL2ltYWdlcy9jYXJvdXNlbF9lbGRhcnlhX2VuaGFuY2VtZW50cy5wbmdcIixcbiAgaDQ6IFwiRWxkYXJ5YSBFbmhhbmNlbWVudHNcIixcbiAgaHJlZjogXCJodHRwczovL2dpdGxhYi5jb20vTmF0b0JvcmFtL2VsZGFyeWEtZW5oYW5jZW1lbnRzXCIsXG4gIGlkOiBcImNhcm91c2VsLWVsZGFyeWEtZW5oYW5jZW1lbnRzXCIsXG4gIHA6IFwiRW5oYW5jZXMgdGhlIHVzZXIgZXhwZXJpZW5jZSBvZiBFbGRhcnlhLlwiLFxufTtcbiIsImltcG9ydCB0eXBlIHsgQ2Fyb3VzZWxOZXdzIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2Nhcm91c2VsX25ld3NcIjtcblxuZXhwb3J0IGNvbnN0IGNhcm91c2VsVGFrZW92ZXI6IENhcm91c2VsTmV3cyA9IHtcbiAgYmFja2dyb3VuZEltYWdlOiBcIi9zdGF0aWMvaW1nL2FsY2hlbXkvYmFja2dyb3VuZC5qcGdcIixcbiAgaWQ6IFwiY2Fyb3VzZWwtdGFrZW92ZXJcIixcbiAgaDQ6IFwiVGFrZW92ZXJcIixcbiAgcDogXCJBdXRvbWF0aWNhbGx5IHBsYXkgbWluaWdhbWVzLlwiLFxufTtcbiIsImltcG9ydCB0eXBlIHsgQ2Fyb3VzZWxOZXdzIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2Nhcm91c2VsX25ld3NcIjtcbmltcG9ydCB7IGNhcm91c2VsQmVlbW9vdkFubm95YW5jZXMgfSBmcm9tIFwiLi9jYXJvdXNlbF9iZWVtb292X2Fubm95YW5jZXNcIjtcbmltcG9ydCB7IGNhcm91c2VsRG93bmxvYWRGYWNlIH0gZnJvbSBcIi4vY2Fyb3VzZWxfZG93bmxvYWRfZmFjZVwiO1xuaW1wb3J0IHsgY2Fyb3VzZWxEb3dubG9hZEd1YXJkaWFuIH0gZnJvbSBcIi4vY2Fyb3VzZWxfZG93bmxvYWRfZ3VhcmRpYW5cIjtcbmltcG9ydCB7IGNhcm91c2VsRUUgfSBmcm9tIFwiLi9jYXJvdXNlbF9lbGRhcnlhX2VuaGFuY2VtZW50c1wiO1xuaW1wb3J0IHsgY2Fyb3VzZWxUYWtlb3ZlciB9IGZyb20gXCIuL2Nhcm91c2VsX3Rha2VvdmVyXCI7XG5cbmV4cG9ydCBjb25zdCBjYXJvdXNlbHM6IENhcm91c2VsTmV3c1tdID0gW1xuICAvLyBJbnRyb1xuICBjYXJvdXNlbEVFLFxuXG4gIC8vIEZlYXR1cmVzXG4gIGNhcm91c2VsRG93bmxvYWRGYWNlLFxuICBjYXJvdXNlbERvd25sb2FkR3VhcmRpYW4sXG4gIGNhcm91c2VsVGFrZW92ZXIsXG5cbiAgLy8gQWRzXG4gIGNhcm91c2VsQmVlbW9vdkFubm95YW5jZXMsXG5dO1xuIiwiZnVuY3Rpb24gZG93bmxvYWRDYW52YXMoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIC8vIE1ha2UgaXQgYW4gaW1hZ2VcbiAgY29uc3QgaW1hZ2UgPSBjYW52YXMudG9EYXRhVVJMKFwiaW1hZ2UvcG5nXCIpO1xuXG4gIC8vIENyZWF0ZSBhIGxpbmtcbiAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICBhLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgaW1hZ2UpO1xuICBhLnNldEF0dHJpYnV0ZShcImRvd25sb2FkXCIsIGAke25hbWV9LnBuZ2ApO1xuXG4gIC8vIFBsYWNlIGl0IG9uIHRoZSBib2R5XG4gIGEuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuXG4gIC8vIFN0YXJ0IHRoZSBkb3dubG9hZFxuICBhLmNsaWNrKCk7XG5cbiAgLy8gUmVtb3ZlIHRoZSBsaW5rXG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZEZhY2UoKTogdm9pZCB7XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTENhbnZhc0VsZW1lbnQ+KFxuICAgIFwiI2F2YXRhci1tZW51LWNvbnRhaW5lciBjYW52YXNcIlxuICApO1xuICBpZiAoIWNhbnZhcykge1xuICAgIGNvbnNvbGUud2FybihcIkNvdWxkbid0IGZpbmQgdGhlIGd1YXJkaWFuJ3MgZmFjZS5cIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZG93bmxvYWRDYW52YXMoY2FudmFzLCBcImZhY2VcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZEd1YXJkaWFuKCk6IHZvaWQge1xuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxDYW52YXNFbGVtZW50PihcbiAgICBcIiNob21lLWF2YXRhci1wbGF5ZXIgY2FudmFzXCJcbiAgKTtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICBjb25zb2xlLndhcm4oXCJDb3VsZG4ndCBmaW5kIHRoZSBndWFyZGlhbi5cIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZG93bmxvYWRDYW52YXMoY2FudmFzLCBcImd1YXJkaWFuXCIpO1xufVxuIiwiZXhwb3J0IGVudW0gTG9jYWxTdG9yYWdlS2V5IHtcbiAgZXhwbG9yYXRpb25zID0gXCJleHBsb3JhdGlvbnNcIixcbiAgZmF2b3JpdGVzID0gXCJmYXZvcml0ZXNcIixcbiAgbWFya2V0ID0gXCJtYXJrZXRcIixcbiAgbWluaWdhbWVzID0gXCJtaW5pZ2FtZXNcIixcbn1cbiIsImltcG9ydCB0eXBlIHsgU2V0dGluZ3MgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvc2V0dGluZ3NcIjtcbmltcG9ydCB7IExvY2FsU3RvcmFnZUtleSB9IGZyb20gXCIuL2xvY2FsX3N0b3JhZ2UuZW51bVwiO1xuaW1wb3J0IHR5cGUgeyBTaGFyZWFibGVPdXRmaXQgfSBmcm9tIFwiLi9zaGFyZWFibGVfb3V0Zml0XCI7XG5cbmV4cG9ydCBjbGFzcyBMb2NhbFN0b3JhZ2Uge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBsb2NhbFN0b3JhZ2UgPSBsb2NhbFN0b3JhZ2U7XG5cbiAgcHVibGljIHN0YXRpYyBnZXQgZXhwbG9yYXRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW4oTG9jYWxTdG9yYWdlS2V5LmV4cGxvcmF0aW9ucywgZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzZXQgZXhwbG9yYXRpb25zKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldEl0ZW0oTG9jYWxTdG9yYWdlS2V5LmV4cGxvcmF0aW9ucywgZW5hYmxlZCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldCBmYXZvcml0ZXMoKTogU2hhcmVhYmxlT3V0Zml0W10ge1xuICAgIGNvbnN0IGpzb24gPSB0aGlzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKExvY2FsU3RvcmFnZUtleS5mYXZvcml0ZXMpO1xuICAgIGNvbnN0IG91dGZpdHM6IFNoYXJlYWJsZU91dGZpdFtdID0ganNvbiAhPSBudWxsID8gSlNPTi5wYXJzZShqc29uKSA6IFtdO1xuICAgIHJldHVybiBvdXRmaXRzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzZXQgZmF2b3JpdGVzKGNsb3RoZXM6IFNoYXJlYWJsZU91dGZpdFtdKSB7XG4gICAgdGhpcy5zZXRJdGVtKExvY2FsU3RvcmFnZUtleS5mYXZvcml0ZXMsIGNsb3RoZXMpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXQgbWFya2V0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW4oTG9jYWxTdG9yYWdlS2V5Lm1hcmtldCwgZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzZXQgbWFya2V0KGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldEl0ZW0oTG9jYWxTdG9yYWdlS2V5Lm1hcmtldCwgZW5hYmxlZCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldCBtaW5pZ2FtZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbihMb2NhbFN0b3JhZ2VLZXkubWluaWdhbWVzLCBmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNldCBtaW5pZ2FtZXMoZW5hYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0SXRlbShMb2NhbFN0b3JhZ2VLZXkubWluaWdhbWVzLCBlbmFibGVkKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IHNldHRpbmdzKCk6IFNldHRpbmdzIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXhwbG9yYXRpb25zOiB0aGlzLmV4cGxvcmF0aW9ucyxcbiAgICAgIG1hcmtldDogdGhpcy5tYXJrZXQsXG4gICAgICBtaW5pZ2FtZXM6IHRoaXMubWluaWdhbWVzLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRCb29sZWFuKGtleTogTG9jYWxTdG9yYWdlS2V5LCBmYWxsYmFjazogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgSlNPTi5wYXJzZSh0aGlzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkgPz8gSlNPTi5zdHJpbmdpZnkoZmFsbGJhY2spKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzZXRJdGVtPFQ+KGtleTogTG9jYWxTdG9yYWdlS2V5LCB2YWx1ZTogVCkge1xuICAgIHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEdldFByaXplc0RhdGEgfSBmcm9tIFwiLi4vYXBpL2dldF9wcml6ZXNfZGF0YVwiO1xuaW1wb3J0IHR5cGUgeyBQYWNrZXQgfSBmcm9tIFwiLi4vYXBpL3BhY2tldFwiO1xuaW1wb3J0IHR5cGUgeyBTdGFydEdhbWVEYXRhIH0gZnJvbSBcIi4uL2FwaS9zdGFydF9nYW1lX2RhdGFcIjtcbmltcG9ydCBcIi4uL2VsZGFyeWEvanF1ZXJ5XCI7XG5pbXBvcnQgeyBmbGFwcHkgfSBmcm9tIFwiLi9mbGFwcHlcIjtcbmltcG9ydCB7IGhhdGNobGluZ3MgfSBmcm9tIFwiLi9oYXRjaGxpbmdzXCI7XG5pbXBvcnQgdHlwZSB7IE1pbmlnYW1lIH0gZnJvbSBcIi4vbWluaWdhbWVcIjtcbmltcG9ydCB7IHBlZ2dsZSB9IGZyb20gXCIuL3BlZ2dsZVwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGxheVBlZ2dsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHBsYXkocGVnZ2xlKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBsYXlGbGFwcHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBwbGF5KGZsYXBweSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwbGF5SGF0Y2hsaW5ncygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHBsYXkoaGF0Y2hsaW5ncyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBsYXkobWluaWdhbWU6IE1pbmlnYW1lKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIERpc2FibGUgYnV0dG9uc1xuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PihcIi5taW5pZ2FtZXMtcnVsZXMgLmZsYXZyLWJ1dHRvblwiKVxuICAgIC5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwiZGlzYWJsZWRcIik7XG4gICAgfSk7XG5cbiAgY29uc3QganNvbiA9IGF3YWl0IGV4ZWN1dGUobWluaWdhbWUpO1xuICAkLmZsYXZyTm90aWYoYFBsYXlpbmcgPHN0cm9uZz4ke21pbmlnYW1lLm5hbWV9PC9zdHJvbmc+Li4uYCk7XG5cbiAgY29uc3QgZ2FtZVRva2VuID0ganNvbi5kYXRhO1xuICBjb25zdCBzY29yZSA9IHJhbmRvbUludChtaW5pZ2FtZS5zY29yZU1pbiwgbWluaWdhbWUuc2NvcmVNYXgpO1xuICBjb25zdCBlbmNfdG9rZW4gPSB4b3JFbmNvZGUoZ2FtZVRva2VuLCBzY29yZS50b1N0cmluZygpKTtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgc2V0VGltZW91dChyZXNvbHZlLCByYW5kb21JbnQobWluaWdhbWUuZGVsYXlNaW4sIG1pbmlnYW1lLmRlbGF5TWF4KSlcbiAgKTtcblxuICBhd2FpdCBnZXRQcml6ZXMobWluaWdhbWUsIGdhbWVUb2tlbiwgc2NvcmUpO1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCByYW5kb21JbnQoMTAwMCwgMzAwMCkpKTtcblxuICBhd2FpdCBzZW5kKGVuY190b2tlbiwgc2NvcmUsIG1pbmlnYW1lLm5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHJhbmRvbUludCgxMDAwLCAzMDAwKSkpO1xufVxuXG5mdW5jdGlvbiByYW5kb21JbnQobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSArIG1pbik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGUobWluaWdhbWU6IE1pbmlnYW1lKTogUHJvbWlzZTxQYWNrZXQ8U3RhcnRHYW1lRGF0YT4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFBhY2tldDxTdGFydEdhbWVEYXRhPj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGlmICh0eXBlb2YgUmVjYXB0Y2hhICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBSZWNhcHRjaGEuZXhlY3V0ZShcbiAgICAgICAgYG1pbmlnYW1lU3RhcnQke21pbmlnYW1lLm5hbWV9YCxcbiAgICAgICAgKHRva2VuKTogdm9pZCA9PlxuICAgICAgICAgIHZvaWQgc3RhcnRHYW1lKG1pbmlnYW1lLCB0b2tlbikudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB2b2lkIHN0YXJ0R2FtZShtaW5pZ2FtZSkudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0R2FtZShtaW5pZ2FtZTogTWluaWdhbWUsIHJlY2FwdGNoYVRva2VuPzogc3RyaW5nKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxQYWNrZXQ8U3RhcnRHYW1lRGF0YT4+KFxuICAgIChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgICB2b2lkICQuYWpheCh7XG4gICAgICAgIHVybDogXCIvbWluaWdhbWVzL2FqYXhfc3RhcnRHYW1lXCIsXG4gICAgICAgIHR5cGU6IFwicG9zdFwiLFxuICAgICAgICBkYXRhVHlwZTogXCJqc29uXCIsXG4gICAgICAgIGRhdGE6IHJlY2FwdGNoYVRva2VuXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGdhbWU6IG1pbmlnYW1lLm5hbWUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICAgcmVjYXB0Y2hhVG9rZW46IHJlY2FwdGNoYVRva2VuLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBnYW1lOiBtaW5pZ2FtZS5uYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICBzdWNjZXNzOiAoanNvbjogUGFja2V0PFN0YXJ0R2FtZURhdGE+KTogdm9pZCA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShqc29uKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFByaXplcyhcbiAgbWluaWdhbWU6IE1pbmlnYW1lLFxuICBnYW1lVG9rZW46IHN0cmluZyxcbiAgc2NvcmU6IG51bWJlclxuKTogUHJvbWlzZTxQYWNrZXQ8R2V0UHJpemVzRGF0YT4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFBhY2tldDxHZXRQcml6ZXNEYXRhPj4oXG4gICAgKHJlc29sdmUpOiB2b2lkID0+XG4gICAgICB2b2lkICQucG9zdChcbiAgICAgICAgXCIvbWluaWdhbWVzL2FqYXhfZ2V0UHJpemVzXCIsXG4gICAgICAgIHsgZ2FtZTogbWluaWdhbWUubmFtZS50b0xvd2VyQ2FzZSgpLCBzY29yZTogc2NvcmUgfSxcbiAgICAgICAgKGpzb246IFBhY2tldDxHZXRQcml6ZXNEYXRhPik6IHZvaWQgPT4ge1xuICAgICAgICAgIHJlc29sdmUoanNvbik7XG5cbiAgICAgICAgICAkLmZsYXZyTm90aWYoXG4gICAgICAgICAgICBgUGxheWVkIDxzdHJvbmc+JHttaW5pZ2FtZS5uYW1lfTwvc3Ryb25nPiBmb3IgPHN0cm9uZyBjbGFzcz1cInByaWNlLWl0ZW1cIj4ke2pzb24uZGF0YS5tYWFuYX08L3N0cm9uZz4gPHNwYW4gY2xhc3M9XCJtYWFuYS1pY29uXCI+PC9zcGFuPi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJqc29uXCJcbiAgICAgICkuZmFpbCgoKSA9PlxuICAgICAgICBzZXRUaW1lb3V0KCgpOiB2b2lkID0+IHtcbiAgICAgICAgICByZXNvbHZlKGdldFByaXplcyhtaW5pZ2FtZSwgZ2FtZVRva2VuLCBzY29yZSkpO1xuICAgICAgICB9LCByYW5kb21JbnQoMTAwMCwgMzAwMCkpXG4gICAgICApXG4gICk7XG59XG5cbi8qKlxuICogU8OpY3VyaXNhdGlvbiBkZSBsJ2Vudm9pIGR1IHNjb3JlXG4gKiBCYXPDqSBzdXIgbCdlbmNvZGFnZSBYT1IgOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1hPUl9jaXBoZXJcbiAqIEVmZmVjdHVlIHVuIFhPUiBiaXQgw6AgYml0IGVudHJlIHVuZSBjaGFpbmUgZXQgdW5lIGNsw6lcbiAqL1xuZnVuY3Rpb24geG9yRW5jb2RlKHN0cjogc3RyaW5nLCBrZXk6IHN0cmluZykge1xuICAvLyBBc3N1cmUgcXVlIGxlcyBkZXV4IHBhcmFtw6h0cmVzIHNvaWVudCBkZXMgY2hhaW5lcyBkZSBjYXJhY3TDqHJlXG4gIHN0ciA9IHN0ci50b1N0cmluZygpO1xuICBrZXkgPSBrZXkudG9TdHJpbmcoKTtcblxuICAvLyBFbmNvZGFnZSBYT1JcbiAgbGV0IHhvciA9IFwiXCI7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgbGV0IHRtcCA9IHN0cltpXTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGtleS5sZW5ndGg7ICsraikge1xuICAgICAgdG1wID0gU3RyaW5nLmZyb21DaGFyQ29kZSh0bXAhLmNoYXJDb2RlQXQoMCkgXiBrZXkuY2hhckNvZGVBdChqKSk7XG4gICAgfVxuICAgIHhvciArPSB0bXA7XG4gIH1cblxuICAvLyBSZW52b2llIGxlIHLDqXN1bHRhdCBlbiBlbmNvZGFudCBsZXMgY2FyYWN0w6hyZXMgc3DDqWNpYXV4IHBvdXZhbnQgcG9zZXIgcHJvYmzDqG1lIChcXG4gcGFyIGV4ZW1wbGUpXG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoeG9yKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VuZChcbiAgZW5jX3Rva2VuOiBzdHJpbmcsXG4gIHNjb3JlOiBudW1iZXIsXG4gIGdhbWU6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgUmVjYXB0Y2hhICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBSZWNhcHRjaGEuZXhlY3V0ZShcbiAgICAgICAgXCJtaW5pZ2FtZVNhdmVcIiArIGdhbWUsXG4gICAgICAgIChyZWNhcHRjaGFUb2tlbik6IHZvaWQgPT5cbiAgICAgICAgICB2b2lkIHNhdmVTY29yZShlbmNfdG9rZW4sIHNjb3JlLCBnYW1lLCByZWNhcHRjaGFUb2tlbikudGhlbihyZXNvbHZlKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm9pZCBzYXZlU2NvcmUoZW5jX3Rva2VuLCBzY29yZSwgZ2FtZSkudGhlbihyZXNvbHZlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlU2NvcmUoXG4gIGVuY190b2tlbjogc3RyaW5nLFxuICBzY29yZTogbnVtYmVyLFxuICBnYW1lOiBzdHJpbmcsXG4gIHJlY2FwdGNoYVRva2VuPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSBkZWNvZGVVUklDb21wb25lbnQoZW5jX3Rva2VuKTtcblxuICAgIHZvaWQgJC5hamF4KHtcbiAgICAgIHR5cGU6IFwicG9zdFwiLFxuICAgICAgdXJsOiBcIi9taW5pZ2FtZXMvYWpheF9zYXZlU2NvcmVcIixcbiAgICAgIGRhdGE6IHJlY2FwdGNoYVRva2VuXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICAgICAgc2NvcmU6IHNjb3JlLFxuICAgICAgICAgICAgZ2FtZTogZ2FtZSxcbiAgICAgICAgICAgIHJlY2FwdGNoYVRva2VuOiByZWNhcHRjaGFUb2tlbixcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICAgICAgc2NvcmU6IHNjb3JlLFxuICAgICAgICAgICAgZ2FtZTogZ2FtZSxcbiAgICAgICAgICB9LFxuICAgICAgc3VjY2VzczogKCk6IHZvaWQgPT4ge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+XG4gICAgICAgIHNldFRpbWVvdXQoKCk6IHZvaWQgPT4ge1xuICAgICAgICAgIHJlc29sdmUoc2F2ZVNjb3JlKGVuY190b2tlbiwgc2NvcmUsIGdhbWUpKTtcbiAgICAgICAgfSwgcmFuZG9tSW50KDEwMDAsIDMwMDApKSxcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1pbmlnYW1lIH0gZnJvbSBcIi4vbWluaWdhbWVcIjtcblxuZXhwb3J0IGNvbnN0IGZsYXBweTogTWluaWdhbWUgPSB7XG4gIG5hbWU6IFwiRmxhcHB5XCIsXG4gIHNjb3JlTWluOiAxODAsXG4gIHNjb3JlTWF4OiAyMDAsXG4gIGRlbGF5TWluOiA2MF8wMDAsXG4gIGRlbGF5TWF4OiA3MF8wMDAsXG4gIGJ1dHRvblNlbGVjdG9yOiAnLm1pbmlnYW1lLXN0YXJ0IFtocmVmPVwiL21pbmlnYW1lcy9idWJibHRlbXBsZVwiXSAubmwtYnV0dG9uJyxcbn07XG4iLCJpbXBvcnQgdHlwZSB7IE1pbmlnYW1lIH0gZnJvbSBcIi4vbWluaWdhbWVcIjtcblxuZXhwb3J0IGNvbnN0IGhhdGNobGluZ3M6IE1pbmlnYW1lID0ge1xuICBuYW1lOiBcIkhhdGNobGluZ3NcIixcbiAgc2NvcmVNaW46IDE4LFxuICBzY29yZU1heDogMjAsXG4gIGRlbGF5TWluOiAzMF8wMDAsXG4gIGRlbGF5TWF4OiAzMF8wMDAsXG4gIGJ1dHRvblNlbGVjdG9yOiAnLm1pbmlnYW1lLXN0YXJ0IFtocmVmPVwiL21pbmlnYW1lcy9jb2Nvb25pbnBpY2tcIl0gLm5sLWJ1dHRvbicsXG59O1xuIiwiaW1wb3J0IHR5cGUgeyBNaW5pZ2FtZSB9IGZyb20gXCIuL21pbmlnYW1lXCI7XG5cbmV4cG9ydCBjb25zdCBwZWdnbGU6IE1pbmlnYW1lID0ge1xuICBuYW1lOiBcIlBlZ2dsZVwiLFxuICBzY29yZU1pbjogOSxcbiAgc2NvcmVNYXg6IDEwLFxuICBkZWxheU1pbjogMTBfMDAwLFxuICBkZWxheU1heDogMjBfMDAwLFxuICBidXR0b25TZWxlY3RvcjogJy5taW5pZ2FtZS1zdGFydCBbaHJlZj1cIi9taW5pZ2FtZXMvZ2VtYm9tYlwiXSAubmwtYnV0dG9uJyxcbn07XG4iLCJpbXBvcnQgdHlwZSB7IFBhcnNhYmxlSXRlbSB9IGZyb20gXCIuL2FwcGVhcmFuY2UvaW50ZXJmYWNlcy9wYXJzYWJsZV9pdGVtXCI7XG5pbXBvcnQgdHlwZSB7IEF2YXRhciB9IGZyb20gXCIuL2VsZGFyeWEvYXZhdGFyXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRPdXRmaXQoc2VsZWN0b3I6IHN0cmluZywgbmFtZSA9IFwib3V0Zml0XCIpOiB2b2lkIHtcbiAgY29uc3QgYXZhdGFyID0gU2FjaGEuQXZhdGFyLmF2YXRhcnNbc2VsZWN0b3JdO1xuICBpZiAoIWF2YXRhcikgcmV0dXJuO1xuXG4gIGNvbnN0IG91dGZpdCA9IGdldEl0ZW1zVG9TYXZlKGF2YXRhcik7XG5cbiAgY29uc3QgaHJlZiA9XG4gICAgXCJkYXRhOnRleHQvanNvbjtjaGFyc2V0PXV0Zi04LFwiICtcbiAgICBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkob3V0Zml0KSk7XG5cbiAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICBhLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgaHJlZik7XG4gIGEuc2V0QXR0cmlidXRlKFwiZG93bmxvYWRcIiwgYCR7bmFtZX0uanNvbmApO1xuICBhLmNsaWNrKCk7XG59XG5cbmZ1bmN0aW9uIGdldEl0ZW1zVG9TYXZlKGF2YXRhcjogQXZhdGFyKTogUGFyc2FibGVJdGVtW10ge1xuICByZXR1cm4gYXZhdGFyLmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICBjb25zdCBpdGVtID0gY2hpbGQuZ2V0SXRlbSgpO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogaXRlbS5faWQsXG4gICAgICBncm91cDogaXRlbS5fZ3JvdXAsXG4gICAgICBuYW1lOiBpdGVtLl9uYW1lLFxuICAgICAgaW1hZ2U6IGl0ZW0uX2ltYWdlLFxuICAgICAgdHlwZTogaXRlbS5fdHlwZSxcbiAgICAgIGNhdGVnb3J5SWQ6IGl0ZW0uX2NhdGVnb3J5SWQsXG4gICAgICBoaWRkZW5DYXRlZ29yaWVzOiBPYmplY3QudmFsdWVzKGl0ZW0uX2hpZGRlbkNhdGVnb3JpZXMpLFxuICAgICAgYW5pbWF0aW9uRGF0YTogaXRlbS5fYW5pbWF0aW9uRGF0YSxcbiAgICAgIGxvY2tlZDogaXRlbS5fbG9ja2VkLFxuICAgIH07XG4gIH0pO1xufVxuIiwiZXhwb3J0IGVudW0gU2Vzc2lvblN0b3JhZ2VLZXkge1xuICB0YWtlb3ZlciA9IFwidGFrZW92ZXJcIixcbiAgbWluaWdhbWVzRG9uZSA9IFwibWluaWdhbWVzRG9uZVwiLFxufVxuIiwiaW1wb3J0IHsgU2Vzc2lvblN0b3JhZ2VLZXkgfSBmcm9tIFwiLi9zZXNzaW9uX3N0b3JhZ2UuZW51bVwiO1xuXG5leHBvcnQgY2xhc3MgU2Vzc2lvblN0b3JhZ2Uge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzZXNzaW9uU3RvcmFnZSA9IHNlc3Npb25TdG9yYWdlO1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IG1pbmlnYW1lc0RvbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbihTZXNzaW9uU3RvcmFnZUtleS5taW5pZ2FtZXNEb25lLCBmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNldCBtaW5pZ2FtZXNEb25lKGRvbmU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldEl0ZW0oU2Vzc2lvblN0b3JhZ2VLZXkubWluaWdhbWVzRG9uZSwgZG9uZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldCB0YWtlb3ZlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuKFNlc3Npb25TdG9yYWdlS2V5LnRha2VvdmVyLCBmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNldCB0YWtlb3ZlcihlbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5LnRha2VvdmVyLCBlbmFibGVkKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldEJvb2xlYW4oXG4gICAga2V5OiBTZXNzaW9uU3RvcmFnZUtleSxcbiAgICBmYWxsYmFjazogYm9vbGVhblxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgIEpTT04ucGFyc2UodGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGtleSkgPz8gSlNPTi5zdHJpbmdpZnkoZmFsbGJhY2spKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzZXRJdGVtPFQ+KGtleTogU2Vzc2lvblN0b3JhZ2VLZXksIHZhbHVlOiBUKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTG9jYWxTdG9yYWdlIH0gZnJvbSBcIi4uL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiO1xuaW1wb3J0IHsgU2Vzc2lvblN0b3JhZ2UgfSBmcm9tIFwiLi4vc2Vzc2lvbl9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZVwiO1xuaW1wb3J0IHsgbG9hZERhaWxpZXMgfSBmcm9tIFwiLi9kYWlseVwiO1xuaW1wb3J0IHsgbG9hZE1pbmlnYW1lcyB9IGZyb20gXCIuL21pbmlnYW1lc1wiO1xuXG4vKiogQXV0b21hdGVkIGVudHJ5IHBvaW50IG9mIHRoZSB0YWtlb3Zlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkVGFrZW92ZXIoKTogdm9pZCB7XG4gIGlmIChTZXNzaW9uU3RvcmFnZS50YWtlb3Zlcikgdm9pZCB0YWtlb3ZlcigpO1xufVxuXG4vKiogTWFudWFsIGVudHJ5IHBvaW50IG9mIHRoZSB0YWtlb3Zlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2dnbGVUYWtlb3ZlcigpOiB2b2lkIHtcbiAgcmVzZXRUYWtlb3ZlcigpO1xuXG4gIFNlc3Npb25TdG9yYWdlLnRha2VvdmVyID0gIVNlc3Npb25TdG9yYWdlLnRha2VvdmVyO1xuICBpZiAoU2Vzc2lvblN0b3JhZ2UudGFrZW92ZXIpXG4gICAgJC5mbGF2ck5vdGlmKFxuICAgICAgXCJUYWtlb3ZlciBtb2RlIGVuYWJsZWQuIFBsZWFzZSBkbyBub3QgaW50ZXJhY3Qgd2l0aCB0aGlzIHRhYi5cIlxuICAgICk7XG4gIGVsc2UgJC5mbGF2ck5vdGlmKFwiVGFrZW92ZXIgbW9kZSBkaXNhYmxlZC5cIik7XG5cbiAgdm9pZCB0YWtlb3ZlcigpO1xufVxuXG5mdW5jdGlvbiByZXNldFRha2VvdmVyKCk6IHZvaWQge1xuICBTZXNzaW9uU3RvcmFnZS5taW5pZ2FtZXNEb25lID0gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRha2VvdmVyKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIVNlc3Npb25TdG9yYWdlLnRha2VvdmVyKSByZXR1cm47XG5cbiAgaWYgKGF3YWl0IGxvYWREYWlsaWVzKCkpIHJlc2V0VGFrZW92ZXIoKTtcblxuICBpZiAoTG9jYWxTdG9yYWdlLm1pbmlnYW1lcyAmJiAhU2Vzc2lvblN0b3JhZ2UubWluaWdhbWVzRG9uZSlcbiAgICBpZiAoYXdhaXQgbG9hZE1pbmlnYW1lcygpKSByZXR1cm47XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIGRvY3VtZW50XG4gICAgICAgIC5xdWVyeVNlbGVjdG9yPEhUTUxBbmNob3JFbGVtZW50PihcIi5tYWluLW1lbnUtbWluaWdhbWVzIGFcIilcbiAgICAgICAgPy5jbGljaygpO1xuXG4gIC8vIFJlZnJlc2ggYWZ0ZXIgMWguXG4gIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICB9LCAzLjZlNik7XG59XG4iLCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZERhaWxpZXMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRhaWx5R2lmdENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZGFpbHktZ2lmdC1jb250YWluZXJcIik7XG4gICAgaWYgKFxuICAgICAgIWRhaWx5R2lmdENvbnRhaW5lciB8fFxuICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShkYWlseUdpZnRDb250YWluZXIpLmRpc3BsYXkgPT09IFwibm9uZVwiXG4gICAgKSB7XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkYWlseUdpZnRDb250YWluZXIuY2xpY2soKTtcblxuICAgIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQnV0dG9uRWxlbWVudD4oXG4gICAgICAgIFwiLmZpcnN0LWNvbm5leGlvbiAuZmxhdnItYnV0dG9uLmRlZmF1bHRcIlxuICAgICAgKTtcblxuICAgICAgaWYgKGJ1dHRvbikge1xuICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgYnV0dG9uLmNsaWNrKCk7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9XG4gICAgfSwgMjUwKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBwbGF5RmxhcHB5LCBwbGF5SGF0Y2hsaW5ncywgcGxheVBlZ2dsZSB9IGZyb20gXCIuLi9taW5pZ2FtZXMvZW1pbGVcIjtcbmltcG9ydCB7IGZsYXBweSB9IGZyb20gXCIuLi9taW5pZ2FtZXMvZmxhcHB5XCI7XG5pbXBvcnQgeyBoYXRjaGxpbmdzIH0gZnJvbSBcIi4uL21pbmlnYW1lcy9oYXRjaGxpbmdzXCI7XG5pbXBvcnQgdHlwZSB7IE1pbmlnYW1lIH0gZnJvbSBcIi4uL21pbmlnYW1lcy9taW5pZ2FtZVwiO1xuaW1wb3J0IHsgcGVnZ2xlIH0gZnJvbSBcIi4uL21pbmlnYW1lcy9wZWdnbGVcIjtcbmltcG9ydCB7IFNlc3Npb25TdG9yYWdlIH0gZnJvbSBcIi4uL3Nlc3Npb25fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRNaW5pZ2FtZXMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHN3aXRjaCAobG9jYXRpb24ucGF0aG5hbWUpIHtcbiAgICBjYXNlIFwiL21pbmlnYW1lc1wiOiB7XG4gICAgICBjb25zdCBwbGF5aW5nID1cbiAgICAgICAgbG9hZE1pbmlnYW1lKHBlZ2dsZSkgfHxcbiAgICAgICAgbG9hZE1pbmlnYW1lKGZsYXBweSkgfHxcbiAgICAgICAgbG9hZE1pbmlnYW1lKGhhdGNobGluZ3MpO1xuXG4gICAgICBpZiAoIXBsYXlpbmcpIHtcbiAgICAgICAgU2Vzc2lvblN0b3JhZ2UubWluaWdhbWVzRG9uZSA9IHRydWU7XG5cbiAgICAgICAgZG9jdW1lbnRcbiAgICAgICAgICAucXVlcnlTZWxlY3RvcjxIVE1MQnV0dG9uRWxlbWVudD4oXG4gICAgICAgICAgICAnLm1pbmlnYW1lcy1ydWxlcyBbcmVsPVwiYnRuLWNhbmNlbFwiXSdcbiAgICAgICAgICApXG4gICAgICAgICAgPy5jbGljaygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBsYXlpbmc7XG4gICAgfVxuXG4gICAgY2FzZSBcIi9taW5pZ2FtZXMvZ2VtYm9tYlwiOlxuICAgICAgYXdhaXQgcGxheVBlZ2dsZSgpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiL21pbmlnYW1lcy9idWJibHRlbXBsZVwiOlxuICAgICAgYXdhaXQgcGxheUZsYXBweSgpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiL21pbmlnYW1lcy9jb2Nvb25pbnBpY2tcIjpcbiAgICAgIGF3YWl0IHBsYXlIYXRjaGxpbmdzKCk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxBbmNob3JFbGVtZW50PihcIi5tYWluLW1lbnUtbWluaWdhbWVzIGFcIik/LmNsaWNrKCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBsb2FkTWluaWdhbWUobWluaWdhbWU6IE1pbmlnYW1lKTogYm9vbGVhbiB7XG4gIGNvbnN0IHN0YXJ0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MU3BhbkVsZW1lbnQ+KFxuICAgIG1pbmlnYW1lLmJ1dHRvblNlbGVjdG9yXG4gICk7XG4gIGlmICghc3RhcnQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGFydC5jbGljaygpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIjtcbmltcG9ydCB7IGV4cG9ydFByZXZpZXcsIGltcG9ydE91dGZpdCB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL2Zhdm9yaXRlc19hY3Rpb25zXCI7XG5pbXBvcnQgdHlwZSB7IEZhdm9yaXRlc0FjdGlvbiB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9mYXZvcml0ZXNfYWN0aW9uXCI7XG5cbmxldCBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlciB8IG51bGw7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQXBwZWFyYW5jZSgpOiB2b2lkIHtcbiAgb2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgb2JzZXJ2ZXIgPSBudWxsO1xuXG4gIGNvbnN0IGFwcGVhcmFuY2VJdGVtcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYXBwZWFyYW5jZS1pdGVtc1wiKTtcbiAgaWYgKCFhcHBlYXJhbmNlSXRlbXMpIHJldHVybjtcblxuICBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGxvYWRBcHBlYXJhbmNlKTtcbiAgb2JzZXJ2ZXIub2JzZXJ2ZShhcHBlYXJhbmNlSXRlbXMsIHtcbiAgICBjaGlsZExpc3Q6IHRydWUsXG4gIH0pO1xuXG4gIGxvYWRGYXZvcml0ZXNBY3Rpb25zKCk7XG59XG5cbmZ1bmN0aW9uIGxvYWRGYXZvcml0ZXNBY3Rpb25zKCk6IHZvaWQge1xuICBjb25zdCBhY3Rpb25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmYXZvcml0ZXMtYWN0aW9uc1wiKTtcbiAgaWYgKCFhY3Rpb25zIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuZmF2b3JpdGVzLWFjdGlvbi1lZVwiKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGFjdGlvblRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9mYXZvcml0ZXNfYWN0aW9uLmh0bWxcIik7XG4gIGNvbnN0IGV4cG9ydEFjdGlvbjogRmF2b3JpdGVzQWN0aW9uID0ge1xuICAgIGlkOiBcImV4cG9ydC1vdXRmaXRcIixcbiAgICB0ZXh0OiBcIkV4cG9ydFwiLFxuICB9O1xuICBjb25zdCBpbXBvcnRBY3Rpb246IEZhdm9yaXRlc0FjdGlvbiA9IHtcbiAgICBpZDogXCJpbXBvcnQtb3V0Zml0XCIsXG4gICAgdGV4dDogXCJJbXBvcnRcIixcbiAgfTtcblxuICBhY3Rpb25zLmluc2VydEFkamFjZW50SFRNTChcImJlZm9yZWVuZFwiLCBhY3Rpb25UZW1wbGF0ZS5yZW5kZXIoZXhwb3J0QWN0aW9uKSk7XG4gIGFjdGlvbnMuaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYmVmb3JlZW5kXCIsIGFjdGlvblRlbXBsYXRlLnJlbmRlcihpbXBvcnRBY3Rpb24pKTtcblxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChleHBvcnRBY3Rpb24uaWQpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZXhwb3J0UHJldmlldyk7XG5cbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoaW1wb3J0QWN0aW9uLmlkKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGltcG9ydE91dGZpdCk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCI7XG5pbXBvcnQgeyBjYXJvdXNlbHMgfSBmcm9tIFwiLi4vY2Fyb3VzZWwvY2Fyb3VzZWxzXCI7XG5pbXBvcnQgeyBjYXJvdXNlbERvd25sb2FkRmFjZSB9IGZyb20gXCIuLi9jYXJvdXNlbC9jYXJvdXNlbF9kb3dubG9hZF9mYWNlXCI7XG5pbXBvcnQgeyBjYXJvdXNlbERvd25sb2FkR3VhcmRpYW4gfSBmcm9tIFwiLi4vY2Fyb3VzZWwvY2Fyb3VzZWxfZG93bmxvYWRfZ3VhcmRpYW5cIjtcbmltcG9ydCB7IGNhcm91c2VsVGFrZW92ZXIgfSBmcm9tIFwiLi4vY2Fyb3VzZWwvY2Fyb3VzZWxfdGFrZW92ZXJcIjtcbmltcG9ydCB7IGRvd25sb2FkRmFjZSwgZG93bmxvYWRHdWFyZGlhbiB9IGZyb20gXCIuLi9kb3dubG9hZC1jYW52YXNcIjtcbmltcG9ydCB7IHRvZ2dsZVRha2VvdmVyIH0gZnJvbSBcIi4uL3Rha2VvdmVyL2JyYWluXCI7XG5pbXBvcnQgdHlwZSB7IENhcm91c2VsTmV3cyB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9jYXJvdXNlbF9uZXdzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQ2Fyb3VzZWwoKTogdm9pZCB7XG4gIGNvbnN0IGNhcm91c2VsSW5uZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2Nhcm91c2VsLWlubmVyXCIpO1xuICBpZiAoIWNhcm91c2VsSW5uZXIgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5jYXJvdXNlbC1lZVwiKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEltcG9ydCBjYXJvdXNlbCB0ZW1wbGF0ZVxuICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvY2Fyb3VzZWxfbmV3cy5odG1sXCIpO1xuXG4gIC8vIEFkZCBlbnRyaWVzIHRvIHRoZSBjYXJvdXNlbFxuICBjYXJvdXNlbElubmVyLmluc2VydEFkamFjZW50SFRNTChcbiAgICBcImJlZm9yZWVuZFwiLFxuICAgIGNhcm91c2Vscy5tYXAoKGJhbm5lcjogQ2Fyb3VzZWxOZXdzKSA9PiB0ZW1wbGF0ZS5yZW5kZXIoYmFubmVyKSkuam9pbihcIlxcblwiKVxuICApO1xuXG4gIC8vIEFkZCBjbGljayBldmVudHNcblxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChjYXJvdXNlbERvd25sb2FkRmFjZS5pZClcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBkb3dubG9hZEZhY2UpO1xuXG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKGNhcm91c2VsRG93bmxvYWRHdWFyZGlhbi5pZClcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBkb3dubG9hZEd1YXJkaWFuKTtcblxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChjYXJvdXNlbFRha2VvdmVyLmlkKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRvZ2dsZVRha2VvdmVyKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIjtcbmltcG9ydCB0eXBlIHsgSG9tZUNvbnRlbnRTbWFsbCB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9ob21lX2NvbnRlbnRfc21hbGxcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRIb21lQ29udGVudCgpOiB2b2lkIHtcbiAgY29uc3QgaG9tZUNvbnRlbnRTbWFsbHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImhvbWUtY29udGVudC1zbWFsbHNcIik7XG4gIGlmIChcbiAgICAhaG9tZUNvbnRlbnRTbWFsbHMgfHxcbiAgICBob21lQ29udGVudFNtYWxscy5xdWVyeVNlbGVjdG9yKFwiLmhvbWUtY29udGVudC1zbWFsbC1lZVwiKVxuICApXG4gICAgcmV0dXJuO1xuXG4gIC8vIFJlbW92ZSBiYW5rXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaG9tZS1iYW5rXCIpPy5yZW1vdmUoKTtcblxuICAvLyBBZGQgZm9ydW1cbiAgY29uc3Qgc21hbGxUZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvaG9tZV9jb250ZW50X3NtYWxsLmh0bWxcIik7XG4gIGNvbnN0IHNtYWxsQ29udGVudDogSG9tZUNvbnRlbnRTbWFsbCA9IHtcbiAgICBiYWNrZ3JvdW5kSW1hZ2U6XG4gICAgICBcIi9hc3NldHMvaW1nL21pbmlnYW1lcy90cmVhc3VyZWh1bnQvYTQ4YmJjNGU0ODQ5NzQ1ZWJlNmRiY2Y1MzEzZWIzZjAuanBnXCIsXG4gICAgaDQ6IFwiRm9ydW1cIixcbiAgICBocmVmOiBcIi9mb3J1bVwiLFxuICAgIGlkOiBcImZvcnVtXCIsXG4gIH07XG5cbiAgaG9tZUNvbnRlbnRTbWFsbHMuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgc21hbGxUZW1wbGF0ZS5yZW5kZXIoc21hbGxDb250ZW50KVxuICApO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBNYWluTWVudSB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9tYWluX21lbnVcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRNZW51KCk6IHZvaWQge1xuICBjb25zdCBtZW51SW5uZXJSaWdodCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWVudS1pbm5lci1yaWdodFwiKTtcbiAgaWYgKCFtZW51SW5uZXJSaWdodCB8fCBtZW51SW5uZXJSaWdodC5xdWVyeVNlbGVjdG9yKFwiLm1haW4tbWVudS1lZVwiKSkgcmV0dXJuO1xuXG4gIC8vIFJlbW92ZSBiYW5rXG4gIG1lbnVJbm5lclJpZ2h0LnF1ZXJ5U2VsZWN0b3IoXCIubWFpbi1tZW51LWJhbmtcIik/LnJlbW92ZSgpO1xuXG4gIC8vIEFkZCBGb3J1bVxuICBjb25zdCBtZW51VGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL21haW5fbWVudS5odG1sXCIpO1xuICBjb25zdCBtYWluTWVudUZvcnVtOiBNYWluTWVudSA9IHtcbiAgICBjbGFzczogXCJmb3J1bVwiLFxuICAgIGhyZWY6IFwiL2ZvcnVtXCIsXG4gICAgdGV4dDogXCJGb3J1bVwiLFxuICB9O1xuXG4gIG1lbnVJbm5lclJpZ2h0Lmluc2VydEFkamFjZW50SFRNTChcbiAgICBcImJlZm9yZWVuZFwiLFxuICAgIG1lbnVUZW1wbGF0ZS5yZW5kZXIobWFpbk1lbnVGb3J1bSlcbiAgKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIjtcbmltcG9ydCB7IGV4cG9ydE91dGZpdCB9IGZyb20gXCIuLi9vdXRmaXRcIjtcbmltcG9ydCB0eXBlIHsgUHJvZmlsZUNvbnRhY3RBY3Rpb24gfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvcHJvZmlsZV9jb250YWN0X2FjdGlvblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gbG9hZFByb2ZpbGUoKTogdm9pZCB7XG4gIGNvbnN0IHByb2ZpbGVDb250YWN0QWN0aW9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgIFwicHJvZmlsZS1jb250YWN0LWFjdGlvbnNcIlxuICApO1xuICBpZiAoXG4gICAgIXByb2ZpbGVDb250YWN0QWN0aW9ucyB8fFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIucHJvZmlsZS1jb250YWN0LWFjdGlvbi1lZVwiKVxuICApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvcHJvZmlsZV9jb250YWN0X2FjdGlvbi5odG1sXCIpO1xuICBjb25zdCBwcm9maWxlQWN0aW9uRXhwb3J0OiBQcm9maWxlQ29udGFjdEFjdGlvbiA9IHtcbiAgICBpZDogXCJwcm9maWxlLWNvbnRhY3QtYWN0aW9uLWV4cG9ydFwiLFxuICAgIGFjdGlvbkRlc2NyaXB0aW9uOiBcIkV4cG9ydCBvdXRmaXRcIixcbiAgfTtcblxuICAvLyBBZGQgZW50cmllc1xuICBwcm9maWxlQ29udGFjdEFjdGlvbnMuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgdGVtcGxhdGUucmVuZGVyKHByb2ZpbGVBY3Rpb25FeHBvcnQpXG4gICk7XG5cbiAgLy8gQWRkIGNsaWNrIGV2ZW50c1xuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChwcm9maWxlQWN0aW9uRXhwb3J0LmlkKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGV4cG9ydFByb2ZpbGUpO1xufVxuXG5mdW5jdGlvbiBleHBvcnRQcm9maWxlKCkge1xuICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEhlYWRpbmdFbGVtZW50PihcbiAgICBcIiNtYWluLXNlY3Rpb24gLnNlY3Rpb24tdGl0bGVcIlxuICApO1xuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhTYWNoYS5BdmF0YXIuYXZhdGFycykuZmlsdGVyKChrZXkpID0+XG4gICAga2V5LnN0YXJ0c1dpdGgoXCIjcGxheWVyUHJvZmlsZUF2YXRhclwiKVxuICApO1xuXG4gIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgZXhwb3J0T3V0Zml0KGtleSwgdGl0bGU/LnRleHRDb250ZW50Py50cmltKCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIjtcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRTZXR0aW5ncygpOiB2b2lkIHtcbiAgY29uc3QgYWNjb3VudFJpZ2h0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhY2NvdW50LXJpZ2h0IGRpdlwiKTtcbiAgaWYgKCFhY2NvdW50UmlnaHQgfHwgYWNjb3VudFJpZ2h0LnF1ZXJ5U2VsZWN0b3IoXCIuYWNjb3VudC1lZS1ibG9jXCIpKSByZXR1cm47XG5cbiAgY29uc3Qgc2V0dGluZ3NUZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvc2V0dGluZ3MuaHRtbFwiKTtcblxuICBhY2NvdW50UmlnaHQuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgc2V0dGluZ3NUZW1wbGF0ZS5yZW5kZXIoTG9jYWxTdG9yYWdlLnNldHRpbmdzKVxuICApO1xuXG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKFwiZWUtbWluaWdhbWVzLWVuYWJsZWRcIilcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICBMb2NhbFN0b3JhZ2UubWluaWdhbWVzID0gIUxvY2FsU3RvcmFnZS5taW5pZ2FtZXM7XG4gICAgICByZWxvYWRTZXR0aW5ncygpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiByZWxvYWRTZXR0aW5ncygpOiB2b2lkIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXCIuYWNjb3VudC1lZS1ibG9jXCIpPy5yZW1vdmUoKTtcbiAgbG9hZFNldHRpbmdzKCk7XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0IHsgbG9hZFRha2VvdmVyIH0gZnJvbSBcIi4vdGFrZW92ZXIvYnJhaW5cIjtcbmltcG9ydCB7IGxvYWRBcHBlYXJhbmNlIH0gZnJvbSBcIi4vdWkvYXBwZWFyYW5jZVwiO1xuaW1wb3J0IHsgbG9hZENhcm91c2VsIH0gZnJvbSBcIi4vdWkvY2Fyb3VzZWxcIjtcbmltcG9ydCB7IGxvYWRIb21lQ29udGVudCB9IGZyb20gXCIuL3VpL2hvbWVfY29udGVudFwiO1xuaW1wb3J0IHsgbG9hZE1lbnUgfSBmcm9tIFwiLi91aS9tZW51XCI7XG5pbXBvcnQgeyBsb2FkUHJvZmlsZSB9IGZyb20gXCIuL3VpL3Byb2ZpbGVcIjtcbmltcG9ydCB7IGxvYWRTZXR0aW5ncyB9IGZyb20gXCIuL3VpL3NldHRpbmdzXCI7XG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG4gIGxvYWRVSSgpO1xuICBsb2FkVGFrZW92ZXIoKTtcbn1cblxuZnVuY3Rpb24gbG9hZFVJKCkge1xuICBsb2FkTWVudSgpO1xuICBsb2FkQ2Fyb3VzZWwoKTtcbiAgbG9hZEhvbWVDb250ZW50KCk7XG4gIGxvYWRBcHBlYXJhbmNlKCk7XG4gIGxvYWRQcm9maWxlKCk7XG4gIGxvYWRTZXR0aW5ncygpO1xufVxuXG5uZXcgTXV0YXRpb25PYnNlcnZlcihsb2FkKS5vYnNlcnZlKDxOb2RlPmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29udGFpbmVyXCIpLCB7XG4gIGNoaWxkTGlzdDogdHJ1ZSxcbn0pO1xubG9hZCgpO1xuXG5jb25zb2xlLmxvZyhcIkVsZGFyeWEgRW5oYW5jZW1lbnRzIGxvYWRlZC5cIik7XG4iXSwic291cmNlUm9vdCI6IiJ9