HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers10/demo.komma.pro/wwwroot/js/site/app.js
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["/js/site/app"],{

/***/ "./node_modules/@babel/runtime/regenerator/index.js":
/*!**********************************************************!*\
  !*** ./node_modules/@babel/runtime/regenerator/index.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

module.exports = __webpack_require__(/*! regenerator-runtime */ "./node_modules/regenerator-runtime/runtime.js");


/***/ }),

/***/ "./node_modules/process/browser.js":
/*!*****************************************!*\
  !*** ./node_modules/process/browser.js ***!
  \*****************************************/
/*! no static exports found */
/***/ (function(module, exports) {

// shim for using process in browser
var process = module.exports = {};

// cached from whatever global is present so that test runners that stub it
// don't break things.  But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals.  It's inside a
// function because try/catches deoptimize in certain engines.

var cachedSetTimeout;
var cachedClearTimeout;

function defaultSetTimout() {
    throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
    throw new Error('clearTimeout has not been defined');
}
(function () {
    try {
        if (typeof setTimeout === 'function') {
            cachedSetTimeout = setTimeout;
        } else {
            cachedSetTimeout = defaultSetTimout;
        }
    } catch (e) {
        cachedSetTimeout = defaultSetTimout;
    }
    try {
        if (typeof clearTimeout === 'function') {
            cachedClearTimeout = clearTimeout;
        } else {
            cachedClearTimeout = defaultClearTimeout;
        }
    } catch (e) {
        cachedClearTimeout = defaultClearTimeout;
    }
} ())
function runTimeout(fun) {
    if (cachedSetTimeout === setTimeout) {
        //normal enviroments in sane situations
        return setTimeout(fun, 0);
    }
    // if setTimeout wasn't available but was latter defined
    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
        cachedSetTimeout = setTimeout;
        return setTimeout(fun, 0);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedSetTimeout(fun, 0);
    } catch(e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
            return cachedSetTimeout.call(null, fun, 0);
        } catch(e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
            return cachedSetTimeout.call(this, fun, 0);
        }
    }


}
function runClearTimeout(marker) {
    if (cachedClearTimeout === clearTimeout) {
        //normal enviroments in sane situations
        return clearTimeout(marker);
    }
    // if clearTimeout wasn't available but was latter defined
    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
        cachedClearTimeout = clearTimeout;
        return clearTimeout(marker);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedClearTimeout(marker);
    } catch (e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
            return cachedClearTimeout.call(null, marker);
        } catch (e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
            return cachedClearTimeout.call(this, marker);
        }
    }



}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;

function cleanUpNextTick() {
    if (!draining || !currentQueue) {
        return;
    }
    draining = false;
    if (currentQueue.length) {
        queue = currentQueue.concat(queue);
    } else {
        queueIndex = -1;
    }
    if (queue.length) {
        drainQueue();
    }
}

function drainQueue() {
    if (draining) {
        return;
    }
    var timeout = runTimeout(cleanUpNextTick);
    draining = true;

    var len = queue.length;
    while(len) {
        currentQueue = queue;
        queue = [];
        while (++queueIndex < len) {
            if (currentQueue) {
                currentQueue[queueIndex].run();
            }
        }
        queueIndex = -1;
        len = queue.length;
    }
    currentQueue = null;
    draining = false;
    runClearTimeout(timeout);
}

process.nextTick = function (fun) {
    var args = new Array(arguments.length - 1);
    if (arguments.length > 1) {
        for (var i = 1; i < arguments.length; i++) {
            args[i - 1] = arguments[i];
        }
    }
    queue.push(new Item(fun, args));
    if (queue.length === 1 && !draining) {
        runTimeout(drainQueue);
    }
};

// v8 likes predictible objects
function Item(fun, array) {
    this.fun = fun;
    this.array = array;
}
Item.prototype.run = function () {
    this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};

function noop() {}

process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;

process.listeners = function (name) { return [] }

process.binding = function (name) {
    throw new Error('process.binding is not supported');
};

process.cwd = function () { return '/' };
process.chdir = function (dir) {
    throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };


/***/ }),

/***/ "./node_modules/regenerator-runtime/runtime.js":
/*!*****************************************************!*\
  !*** ./node_modules/regenerator-runtime/runtime.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/**
 * Copyright (c) 2014-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

var runtime = (function (exports) {
  "use strict";

  var Op = Object.prototype;
  var hasOwn = Op.hasOwnProperty;
  var undefined; // More compressible than void 0.
  var $Symbol = typeof Symbol === "function" ? Symbol : {};
  var iteratorSymbol = $Symbol.iterator || "@@iterator";
  var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
  var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";

  function wrap(innerFn, outerFn, self, tryLocsList) {
    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
    var generator = Object.create(protoGenerator.prototype);
    var context = new Context(tryLocsList || []);

    // The ._invoke method unifies the implementations of the .next,
    // .throw, and .return methods.
    generator._invoke = makeInvokeMethod(innerFn, self, context);

    return generator;
  }
  exports.wrap = wrap;

  // Try/catch helper to minimize deoptimizations. Returns a completion
  // record like context.tryEntries[i].completion. This interface could
  // have been (and was previously) designed to take a closure to be
  // invoked without arguments, but in all the cases we care about we
  // already have an existing method we want to call, so there's no need
  // to create a new function object. We can even get away with assuming
  // the method takes exactly one argument, since that happens to be true
  // in every case, so we don't have to touch the arguments object. The
  // only additional allocation required is the completion record, which
  // has a stable shape and so hopefully should be cheap to allocate.
  function tryCatch(fn, obj, arg) {
    try {
      return { type: "normal", arg: fn.call(obj, arg) };
    } catch (err) {
      return { type: "throw", arg: err };
    }
  }

  var GenStateSuspendedStart = "suspendedStart";
  var GenStateSuspendedYield = "suspendedYield";
  var GenStateExecuting = "executing";
  var GenStateCompleted = "completed";

  // Returning this object from the innerFn has the same effect as
  // breaking out of the dispatch switch statement.
  var ContinueSentinel = {};

  // Dummy constructor functions that we use as the .constructor and
  // .constructor.prototype properties for functions that return Generator
  // objects. For full spec compliance, you may wish to configure your
  // minifier not to mangle the names of these two functions.
  function Generator() {}
  function GeneratorFunction() {}
  function GeneratorFunctionPrototype() {}

  // This is a polyfill for %IteratorPrototype% for environments that
  // don't natively support it.
  var IteratorPrototype = {};
  IteratorPrototype[iteratorSymbol] = function () {
    return this;
  };

  var getProto = Object.getPrototypeOf;
  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
  if (NativeIteratorPrototype &&
      NativeIteratorPrototype !== Op &&
      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
    // This environment has a native %IteratorPrototype%; use it instead
    // of the polyfill.
    IteratorPrototype = NativeIteratorPrototype;
  }

  var Gp = GeneratorFunctionPrototype.prototype =
    Generator.prototype = Object.create(IteratorPrototype);
  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
  GeneratorFunctionPrototype.constructor = GeneratorFunction;
  GeneratorFunctionPrototype[toStringTagSymbol] =
    GeneratorFunction.displayName = "GeneratorFunction";

  // Helper for defining the .next, .throw, and .return methods of the
  // Iterator interface in terms of a single ._invoke method.
  function defineIteratorMethods(prototype) {
    ["next", "throw", "return"].forEach(function(method) {
      prototype[method] = function(arg) {
        return this._invoke(method, arg);
      };
    });
  }

  exports.isGeneratorFunction = function(genFun) {
    var ctor = typeof genFun === "function" && genFun.constructor;
    return ctor
      ? ctor === GeneratorFunction ||
        // For the native GeneratorFunction constructor, the best we can
        // do is to check its .name property.
        (ctor.displayName || ctor.name) === "GeneratorFunction"
      : false;
  };

  exports.mark = function(genFun) {
    if (Object.setPrototypeOf) {
      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
    } else {
      genFun.__proto__ = GeneratorFunctionPrototype;
      if (!(toStringTagSymbol in genFun)) {
        genFun[toStringTagSymbol] = "GeneratorFunction";
      }
    }
    genFun.prototype = Object.create(Gp);
    return genFun;
  };

  // Within the body of any async function, `await x` is transformed to
  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
  // `hasOwn.call(value, "__await")` to determine if the yielded value is
  // meant to be awaited.
  exports.awrap = function(arg) {
    return { __await: arg };
  };

  function AsyncIterator(generator) {
    function invoke(method, arg, resolve, reject) {
      var record = tryCatch(generator[method], generator, arg);
      if (record.type === "throw") {
        reject(record.arg);
      } else {
        var result = record.arg;
        var value = result.value;
        if (value &&
            typeof value === "object" &&
            hasOwn.call(value, "__await")) {
          return Promise.resolve(value.__await).then(function(value) {
            invoke("next", value, resolve, reject);
          }, function(err) {
            invoke("throw", err, resolve, reject);
          });
        }

        return Promise.resolve(value).then(function(unwrapped) {
          // When a yielded Promise is resolved, its final value becomes
          // the .value of the Promise<{value,done}> result for the
          // current iteration.
          result.value = unwrapped;
          resolve(result);
        }, function(error) {
          // If a rejected Promise was yielded, throw the rejection back
          // into the async generator function so it can be handled there.
          return invoke("throw", error, resolve, reject);
        });
      }
    }

    var previousPromise;

    function enqueue(method, arg) {
      function callInvokeWithMethodAndArg() {
        return new Promise(function(resolve, reject) {
          invoke(method, arg, resolve, reject);
        });
      }

      return previousPromise =
        // If enqueue has been called before, then we want to wait until
        // all previous Promises have been resolved before calling invoke,
        // so that results are always delivered in the correct order. If
        // enqueue has not been called before, then it is important to
        // call invoke immediately, without waiting on a callback to fire,
        // so that the async generator function has the opportunity to do
        // any necessary setup in a predictable way. This predictability
        // is why the Promise constructor synchronously invokes its
        // executor callback, and why async functions synchronously
        // execute code before the first await. Since we implement simple
        // async functions in terms of async generators, it is especially
        // important to get this right, even though it requires care.
        previousPromise ? previousPromise.then(
          callInvokeWithMethodAndArg,
          // Avoid propagating failures to Promises returned by later
          // invocations of the iterator.
          callInvokeWithMethodAndArg
        ) : callInvokeWithMethodAndArg();
    }

    // Define the unified helper method that is used to implement .next,
    // .throw, and .return (see defineIteratorMethods).
    this._invoke = enqueue;
  }

  defineIteratorMethods(AsyncIterator.prototype);
  AsyncIterator.prototype[asyncIteratorSymbol] = function () {
    return this;
  };
  exports.AsyncIterator = AsyncIterator;

  // Note that simple async functions are implemented on top of
  // AsyncIterator objects; they just return a Promise for the value of
  // the final result produced by the iterator.
  exports.async = function(innerFn, outerFn, self, tryLocsList) {
    var iter = new AsyncIterator(
      wrap(innerFn, outerFn, self, tryLocsList)
    );

    return exports.isGeneratorFunction(outerFn)
      ? iter // If outerFn is a generator, return the full iterator.
      : iter.next().then(function(result) {
          return result.done ? result.value : iter.next();
        });
  };

  function makeInvokeMethod(innerFn, self, context) {
    var state = GenStateSuspendedStart;

    return function invoke(method, arg) {
      if (state === GenStateExecuting) {
        throw new Error("Generator is already running");
      }

      if (state === GenStateCompleted) {
        if (method === "throw") {
          throw arg;
        }

        // Be forgiving, per 25.3.3.3.3 of the spec:
        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
        return doneResult();
      }

      context.method = method;
      context.arg = arg;

      while (true) {
        var delegate = context.delegate;
        if (delegate) {
          var delegateResult = maybeInvokeDelegate(delegate, context);
          if (delegateResult) {
            if (delegateResult === ContinueSentinel) continue;
            return delegateResult;
          }
        }

        if (context.method === "next") {
          // Setting context._sent for legacy support of Babel's
          // function.sent implementation.
          context.sent = context._sent = context.arg;

        } else if (context.method === "throw") {
          if (state === GenStateSuspendedStart) {
            state = GenStateCompleted;
            throw context.arg;
          }

          context.dispatchException(context.arg);

        } else if (context.method === "return") {
          context.abrupt("return", context.arg);
        }

        state = GenStateExecuting;

        var record = tryCatch(innerFn, self, context);
        if (record.type === "normal") {
          // If an exception is thrown from innerFn, we leave state ===
          // GenStateExecuting and loop back for another invocation.
          state = context.done
            ? GenStateCompleted
            : GenStateSuspendedYield;

          if (record.arg === ContinueSentinel) {
            continue;
          }

          return {
            value: record.arg,
            done: context.done
          };

        } else if (record.type === "throw") {
          state = GenStateCompleted;
          // Dispatch the exception by looping back around to the
          // context.dispatchException(context.arg) call above.
          context.method = "throw";
          context.arg = record.arg;
        }
      }
    };
  }

  // Call delegate.iterator[context.method](context.arg) and handle the
  // result, either by returning a { value, done } result from the
  // delegate iterator, or by modifying context.method and context.arg,
  // setting context.delegate to null, and returning the ContinueSentinel.
  function maybeInvokeDelegate(delegate, context) {
    var method = delegate.iterator[context.method];
    if (method === undefined) {
      // A .throw or .return when the delegate iterator has no .throw
      // method always terminates the yield* loop.
      context.delegate = null;

      if (context.method === "throw") {
        // Note: ["return"] must be used for ES3 parsing compatibility.
        if (delegate.iterator["return"]) {
          // If the delegate iterator has a return method, give it a
          // chance to clean up.
          context.method = "return";
          context.arg = undefined;
          maybeInvokeDelegate(delegate, context);

          if (context.method === "throw") {
            // If maybeInvokeDelegate(context) changed context.method from
            // "return" to "throw", let that override the TypeError below.
            return ContinueSentinel;
          }
        }

        context.method = "throw";
        context.arg = new TypeError(
          "The iterator does not provide a 'throw' method");
      }

      return ContinueSentinel;
    }

    var record = tryCatch(method, delegate.iterator, context.arg);

    if (record.type === "throw") {
      context.method = "throw";
      context.arg = record.arg;
      context.delegate = null;
      return ContinueSentinel;
    }

    var info = record.arg;

    if (! info) {
      context.method = "throw";
      context.arg = new TypeError("iterator result is not an object");
      context.delegate = null;
      return ContinueSentinel;
    }

    if (info.done) {
      // Assign the result of the finished delegate to the temporary
      // variable specified by delegate.resultName (see delegateYield).
      context[delegate.resultName] = info.value;

      // Resume execution at the desired location (see delegateYield).
      context.next = delegate.nextLoc;

      // If context.method was "throw" but the delegate handled the
      // exception, let the outer generator proceed normally. If
      // context.method was "next", forget context.arg since it has been
      // "consumed" by the delegate iterator. If context.method was
      // "return", allow the original .return call to continue in the
      // outer generator.
      if (context.method !== "return") {
        context.method = "next";
        context.arg = undefined;
      }

    } else {
      // Re-yield the result returned by the delegate method.
      return info;
    }

    // The delegate iterator is finished, so forget it and continue with
    // the outer generator.
    context.delegate = null;
    return ContinueSentinel;
  }

  // Define Generator.prototype.{next,throw,return} in terms of the
  // unified ._invoke helper method.
  defineIteratorMethods(Gp);

  Gp[toStringTagSymbol] = "Generator";

  // A Generator should always return itself as the iterator object when the
  // @@iterator function is called on it. Some browsers' implementations of the
  // iterator prototype chain incorrectly implement this, causing the Generator
  // object to not be returned from this call. This ensures that doesn't happen.
  // See https://github.com/facebook/regenerator/issues/274 for more details.
  Gp[iteratorSymbol] = function() {
    return this;
  };

  Gp.toString = function() {
    return "[object Generator]";
  };

  function pushTryEntry(locs) {
    var entry = { tryLoc: locs[0] };

    if (1 in locs) {
      entry.catchLoc = locs[1];
    }

    if (2 in locs) {
      entry.finallyLoc = locs[2];
      entry.afterLoc = locs[3];
    }

    this.tryEntries.push(entry);
  }

  function resetTryEntry(entry) {
    var record = entry.completion || {};
    record.type = "normal";
    delete record.arg;
    entry.completion = record;
  }

  function Context(tryLocsList) {
    // The root entry object (effectively a try statement without a catch
    // or a finally block) gives us a place to store values thrown from
    // locations where there is no enclosing try statement.
    this.tryEntries = [{ tryLoc: "root" }];
    tryLocsList.forEach(pushTryEntry, this);
    this.reset(true);
  }

  exports.keys = function(object) {
    var keys = [];
    for (var key in object) {
      keys.push(key);
    }
    keys.reverse();

    // Rather than returning an object with a next method, we keep
    // things simple and return the next function itself.
    return function next() {
      while (keys.length) {
        var key = keys.pop();
        if (key in object) {
          next.value = key;
          next.done = false;
          return next;
        }
      }

      // To avoid creating an additional object, we just hang the .value
      // and .done properties off the next function object itself. This
      // also ensures that the minifier will not anonymize the function.
      next.done = true;
      return next;
    };
  };

  function values(iterable) {
    if (iterable) {
      var iteratorMethod = iterable[iteratorSymbol];
      if (iteratorMethod) {
        return iteratorMethod.call(iterable);
      }

      if (typeof iterable.next === "function") {
        return iterable;
      }

      if (!isNaN(iterable.length)) {
        var i = -1, next = function next() {
          while (++i < iterable.length) {
            if (hasOwn.call(iterable, i)) {
              next.value = iterable[i];
              next.done = false;
              return next;
            }
          }

          next.value = undefined;
          next.done = true;

          return next;
        };

        return next.next = next;
      }
    }

    // Return an iterator with no values.
    return { next: doneResult };
  }
  exports.values = values;

  function doneResult() {
    return { value: undefined, done: true };
  }

  Context.prototype = {
    constructor: Context,

    reset: function(skipTempReset) {
      this.prev = 0;
      this.next = 0;
      // Resetting context._sent for legacy support of Babel's
      // function.sent implementation.
      this.sent = this._sent = undefined;
      this.done = false;
      this.delegate = null;

      this.method = "next";
      this.arg = undefined;

      this.tryEntries.forEach(resetTryEntry);

      if (!skipTempReset) {
        for (var name in this) {
          // Not sure about the optimal order of these conditions:
          if (name.charAt(0) === "t" &&
              hasOwn.call(this, name) &&
              !isNaN(+name.slice(1))) {
            this[name] = undefined;
          }
        }
      }
    },

    stop: function() {
      this.done = true;

      var rootEntry = this.tryEntries[0];
      var rootRecord = rootEntry.completion;
      if (rootRecord.type === "throw") {
        throw rootRecord.arg;
      }

      return this.rval;
    },

    dispatchException: function(exception) {
      if (this.done) {
        throw exception;
      }

      var context = this;
      function handle(loc, caught) {
        record.type = "throw";
        record.arg = exception;
        context.next = loc;

        if (caught) {
          // If the dispatched exception was caught by a catch block,
          // then let that catch block handle the exception normally.
          context.method = "next";
          context.arg = undefined;
        }

        return !! caught;
      }

      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        var record = entry.completion;

        if (entry.tryLoc === "root") {
          // Exception thrown outside of any try block that could handle
          // it, so set the completion value of the entire function to
          // throw the exception.
          return handle("end");
        }

        if (entry.tryLoc <= this.prev) {
          var hasCatch = hasOwn.call(entry, "catchLoc");
          var hasFinally = hasOwn.call(entry, "finallyLoc");

          if (hasCatch && hasFinally) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            } else if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }

          } else if (hasCatch) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            }

          } else if (hasFinally) {
            if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }

          } else {
            throw new Error("try statement without catch or finally");
          }
        }
      }
    },

    abrupt: function(type, arg) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.tryLoc <= this.prev &&
            hasOwn.call(entry, "finallyLoc") &&
            this.prev < entry.finallyLoc) {
          var finallyEntry = entry;
          break;
        }
      }

      if (finallyEntry &&
          (type === "break" ||
           type === "continue") &&
          finallyEntry.tryLoc <= arg &&
          arg <= finallyEntry.finallyLoc) {
        // Ignore the finally entry if control is not jumping to a
        // location outside the try/catch block.
        finallyEntry = null;
      }

      var record = finallyEntry ? finallyEntry.completion : {};
      record.type = type;
      record.arg = arg;

      if (finallyEntry) {
        this.method = "next";
        this.next = finallyEntry.finallyLoc;
        return ContinueSentinel;
      }

      return this.complete(record);
    },

    complete: function(record, afterLoc) {
      if (record.type === "throw") {
        throw record.arg;
      }

      if (record.type === "break" ||
          record.type === "continue") {
        this.next = record.arg;
      } else if (record.type === "return") {
        this.rval = this.arg = record.arg;
        this.method = "return";
        this.next = "end";
      } else if (record.type === "normal" && afterLoc) {
        this.next = afterLoc;
      }

      return ContinueSentinel;
    },

    finish: function(finallyLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.finallyLoc === finallyLoc) {
          this.complete(entry.completion, entry.afterLoc);
          resetTryEntry(entry);
          return ContinueSentinel;
        }
      }
    },

    "catch": function(tryLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.tryLoc === tryLoc) {
          var record = entry.completion;
          if (record.type === "throw") {
            var thrown = record.arg;
            resetTryEntry(entry);
          }
          return thrown;
        }
      }

      // The context.catch method must only be called with a location
      // argument that corresponds to a known catch block.
      throw new Error("illegal catch attempt");
    },

    delegateYield: function(iterable, resultName, nextLoc) {
      this.delegate = {
        iterator: values(iterable),
        resultName: resultName,
        nextLoc: nextLoc
      };

      if (this.method === "next") {
        // Deliberately forget the last sent value so that we don't
        // accidentally pass it on to the delegate.
        this.arg = undefined;
      }

      return ContinueSentinel;
    }
  };

  // Regardless of whether this script is executing as a CommonJS module
  // or not, return the runtime object so that we can declare the variable
  // regeneratorRuntime in the outer scope, which allows this module to be
  // injected easily by `bin/regenerator --include-runtime script.js`.
  return exports;

}(
  // If this script is executing as a CommonJS module, use module.exports
  // as the regeneratorRuntime namespace. Otherwise create a new empty
  // object. Either way, the resulting object will be used to initialize
  // the regeneratorRuntime variable at the top of this file.
   true ? module.exports : undefined
));

try {
  regeneratorRuntime = runtime;
} catch (accidentalStrictMode) {
  // This module should not be running in strict mode, so the above
  // assignment should always work unless something is misconfigured. Just
  // in case runtime.js accidentally runs in strict mode, we can escape
  // strict mode using a global Function call. This could conceivably fail
  // if a Content Security Policy forbids using Function, but in that case
  // the proper solution is to fix the accidental strict mode problem. If
  // you've misconfigured your bundler to force strict mode and applied a
  // CSP to forbid Function, and you're not willing to fix either of those
  // problems, please detail your unique predicament in a GitHub issue.
  Function("r", "regeneratorRuntime = r")(runtime);
}


/***/ }),

/***/ "./node_modules/setimmediate/setImmediate.js":
/*!***************************************************!*\
  !*** ./node_modules/setimmediate/setImmediate.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {
    "use strict";

    if (global.setImmediate) {
        return;
    }

    var nextHandle = 1; // Spec says greater than zero
    var tasksByHandle = {};
    var currentlyRunningATask = false;
    var doc = global.document;
    var registerImmediate;

    function setImmediate(callback) {
      // Callback can either be a function or a string
      if (typeof callback !== "function") {
        callback = new Function("" + callback);
      }
      // Copy function arguments
      var args = new Array(arguments.length - 1);
      for (var i = 0; i < args.length; i++) {
          args[i] = arguments[i + 1];
      }
      // Store and register the task
      var task = { callback: callback, args: args };
      tasksByHandle[nextHandle] = task;
      registerImmediate(nextHandle);
      return nextHandle++;
    }

    function clearImmediate(handle) {
        delete tasksByHandle[handle];
    }

    function run(task) {
        var callback = task.callback;
        var args = task.args;
        switch (args.length) {
        case 0:
            callback();
            break;
        case 1:
            callback(args[0]);
            break;
        case 2:
            callback(args[0], args[1]);
            break;
        case 3:
            callback(args[0], args[1], args[2]);
            break;
        default:
            callback.apply(undefined, args);
            break;
        }
    }

    function runIfPresent(handle) {
        // From the spec: "Wait until any invocations of this algorithm started before this one have completed."
        // So if we're currently running a task, we'll need to delay this invocation.
        if (currentlyRunningATask) {
            // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
            // "too much recursion" error.
            setTimeout(runIfPresent, 0, handle);
        } else {
            var task = tasksByHandle[handle];
            if (task) {
                currentlyRunningATask = true;
                try {
                    run(task);
                } finally {
                    clearImmediate(handle);
                    currentlyRunningATask = false;
                }
            }
        }
    }

    function installNextTickImplementation() {
        registerImmediate = function(handle) {
            process.nextTick(function () { runIfPresent(handle); });
        };
    }

    function canUsePostMessage() {
        // The test against `importScripts` prevents this implementation from being installed inside a web worker,
        // where `global.postMessage` means something completely different and can't be used for this purpose.
        if (global.postMessage && !global.importScripts) {
            var postMessageIsAsynchronous = true;
            var oldOnMessage = global.onmessage;
            global.onmessage = function() {
                postMessageIsAsynchronous = false;
            };
            global.postMessage("", "*");
            global.onmessage = oldOnMessage;
            return postMessageIsAsynchronous;
        }
    }

    function installPostMessageImplementation() {
        // Installs an event handler on `global` for the `message` event: see
        // * https://developer.mozilla.org/en/DOM/window.postMessage
        // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages

        var messagePrefix = "setImmediate$" + Math.random() + "$";
        var onGlobalMessage = function(event) {
            if (event.source === global &&
                typeof event.data === "string" &&
                event.data.indexOf(messagePrefix) === 0) {
                runIfPresent(+event.data.slice(messagePrefix.length));
            }
        };

        if (global.addEventListener) {
            global.addEventListener("message", onGlobalMessage, false);
        } else {
            global.attachEvent("onmessage", onGlobalMessage);
        }

        registerImmediate = function(handle) {
            global.postMessage(messagePrefix + handle, "*");
        };
    }

    function installMessageChannelImplementation() {
        var channel = new MessageChannel();
        channel.port1.onmessage = function(event) {
            var handle = event.data;
            runIfPresent(handle);
        };

        registerImmediate = function(handle) {
            channel.port2.postMessage(handle);
        };
    }

    function installReadyStateChangeImplementation() {
        var html = doc.documentElement;
        registerImmediate = function(handle) {
            // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
            // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
            var script = doc.createElement("script");
            script.onreadystatechange = function () {
                runIfPresent(handle);
                script.onreadystatechange = null;
                html.removeChild(script);
                script = null;
            };
            html.appendChild(script);
        };
    }

    function installSetTimeoutImplementation() {
        registerImmediate = function(handle) {
            setTimeout(runIfPresent, 0, handle);
        };
    }

    // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
    var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
    attachTo = attachTo && attachTo.setTimeout ? attachTo : global;

    // Don't get fooled by e.g. browserify environments.
    if ({}.toString.call(global.process) === "[object process]") {
        // For Node.js before 0.9
        installNextTickImplementation();

    } else if (canUsePostMessage()) {
        // For non-IE10 modern browsers
        installPostMessageImplementation();

    } else if (global.MessageChannel) {
        // For web workers, where supported
        installMessageChannelImplementation();

    } else if (doc && "onreadystatechange" in doc.createElement("script")) {
        // For IE 6–8
        installReadyStateChangeImplementation();

    } else {
        // For older browsers
        installSetTimeoutImplementation();
    }

    attachTo.setImmediate = setImmediate;
    attachTo.clearImmediate = clearImmediate;
}(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self));

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../process/browser.js */ "./node_modules/process/browser.js")))

/***/ }),

/***/ "./node_modules/timers-browserify/main.js":
/*!************************************************!*\
  !*** ./node_modules/timers-browserify/main.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(global) {var scope = (typeof global !== "undefined" && global) ||
            (typeof self !== "undefined" && self) ||
            window;
var apply = Function.prototype.apply;

// DOM APIs, for completeness

exports.setTimeout = function() {
  return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);
};
exports.setInterval = function() {
  return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);
};
exports.clearTimeout =
exports.clearInterval = function(timeout) {
  if (timeout) {
    timeout.close();
  }
};

function Timeout(id, clearFn) {
  this._id = id;
  this._clearFn = clearFn;
}
Timeout.prototype.unref = Timeout.prototype.ref = function() {};
Timeout.prototype.close = function() {
  this._clearFn.call(scope, this._id);
};

// Does not start the time, just sets up the members needed.
exports.enroll = function(item, msecs) {
  clearTimeout(item._idleTimeoutId);
  item._idleTimeout = msecs;
};

exports.unenroll = function(item) {
  clearTimeout(item._idleTimeoutId);
  item._idleTimeout = -1;
};

exports._unrefActive = exports.active = function(item) {
  clearTimeout(item._idleTimeoutId);

  var msecs = item._idleTimeout;
  if (msecs >= 0) {
    item._idleTimeoutId = setTimeout(function onTimeout() {
      if (item._onTimeout)
        item._onTimeout();
    }, msecs);
  }
};

// setimmediate attaches itself to the global object
__webpack_require__(/*! setimmediate */ "./node_modules/setimmediate/setImmediate.js");
// On some exotic environments, it's not clear which object `setimmediate` was
// able to install onto.  Search each possibility in the same order as the
// `setimmediate` library.
exports.setImmediate = (typeof self !== "undefined" && self.setImmediate) ||
                       (typeof global !== "undefined" && global.setImmediate) ||
                       (this && this.setImmediate);
exports.clearImmediate = (typeof self !== "undefined" && self.clearImmediate) ||
                         (typeof global !== "undefined" && global.clearImmediate) ||
                         (this && this.clearImmediate);

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))

/***/ }),

/***/ "./node_modules/webpack/buildin/global.js":
/*!***********************************!*\
  !*** (webpack)/buildin/global.js ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports) {

var g;

// This works in non-strict mode
g = (function() {
	return this;
})();

try {
	// This works if eval is allowed (see CSP)
	g = g || new Function("return this")();
} catch (e) {
	// This works if the window reference is available
	if (typeof window === "object") g = window;
}

// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}

module.exports = g;


/***/ }),

/***/ "./resources/js/global/models/address.js":
/*!***********************************************!*\
  !*** ./resources/js/global/models/address.js ***!
  \***********************************************/
/*! exports provided: Address */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Address", function() { return Address; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

/**
 * Address model.
 * To carry around address data
 */
var Address =
/*#__PURE__*/
function () {
  function Address() {
    _classCallCheck(this, Address);

    this._street = '';
    this._house_number = '';
    this._postal_code = '';
    this._city = '';
    this._phone = '';
    this._countryIso3 = '';
    this.toJSON = this._toJson.bind(this);
  }

  _createClass(Address, [{
    key: "_toJson",
    value: function _toJson() {
      return {
        'street': this._street,
        'house_number': this._house_number,
        'postal_code': this._postal_code,
        'city': this._city,
        'phone': this._phone,
        'countryIso3': this._countryIso3
      };
    }
  }, {
    key: "street",
    get: function get() {
      return this._street;
    },
    set: function set(value) {
      this._street = value;
    }
  }, {
    key: "house_number",
    get: function get() {
      return this._house_number;
    },
    set: function set(value) {
      this._house_number = value;
    }
  }, {
    key: "postal_code",
    get: function get() {
      return this._postal_code;
    },
    set: function set(value) {
      this._postal_code = value;
    }
  }, {
    key: "city",
    get: function get() {
      return this._city;
    },
    set: function set(value) {
      this._city = value;
    }
  }, {
    key: "phone",
    get: function get() {
      return this._phone;
    },
    set: function set(value) {
      this._phone = value;
    }
  }, {
    key: "countryIso3",
    get: function get() {
      return this._countryIso3;
    },
    set: function set(value) {
      this._countryIso3 = value;
    }
  }]);

  return Address;
}();



/***/ }),

/***/ "./resources/js/global/models/checkoutInformationResponse.js":
/*!*******************************************************************!*\
  !*** ./resources/js/global/models/checkoutInformationResponse.js ***!
  \*******************************************************************/
/*! exports provided: CheckoutInformationResponse */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CheckoutInformationResponse", function() { return CheckoutInformationResponse; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var CheckoutInformationResponse =
/*#__PURE__*/
function () {
  function CheckoutInformationResponse() {
    _classCallCheck(this, CheckoutInformationResponse);

    this._totalExVatAndDiscounts = 0;
    this._totalExVatAndDiscountsFormatted = '';
    this._totalExVat = 0;
    this._totalExVatFormatted = '';
    this._vatTotal = 0;
    this._vatTotalFormatted = '';
    this._shippingCosts = 0;
    this._shippingCostsFormatted = '';
    this._total = 0;
    this._totalFormatted = '';
    this._vatPercentage = 0;
    this._couponCodes = [];
  }
  /**
   * @param {string} json
   * @return {CheckoutInformationResponse|null}
   */


  _createClass(CheckoutInformationResponse, [{
    key: "totalExVatAndDiscounts",
    get: function get() {
      return this._totalExVatAndDiscounts;
    }
  }, {
    key: "totalExVatAndDiscountsFormatted",
    get: function get() {
      return this._totalExVatAndDiscountsFormatted;
    }
  }, {
    key: "totalExVat",
    get: function get() {
      return this._totalExVat;
    }
  }, {
    key: "totalExVatFormatted",
    get: function get() {
      return this._totalExVatFormatted;
    }
  }, {
    key: "vatTotal",
    get: function get() {
      return this._vatTotal;
    }
  }, {
    key: "vatTotalFormatted",
    get: function get() {
      return this._vatTotalFormatted;
    }
  }, {
    key: "shippingCosts",
    get: function get() {
      return this._shippingCosts;
    }
  }, {
    key: "shippingCostsFormatted",
    get: function get() {
      return this._shippingCostsFormatted;
    }
  }, {
    key: "total",
    get: function get() {
      return this._total;
    }
  }, {
    key: "totalFormatted",
    get: function get() {
      return this._totalFormatted;
    }
  }, {
    key: "vatPercentage",
    get: function get() {
      return this._vatPercentage;
    }
  }, {
    key: "couponCodes",
    get: function get() {
      return this._couponCodes;
    }
  }], [{
    key: "fromJsonString",
    value: function fromJsonString(json) {
      if (!this.is(json)) {
        return null;
      }

      var jsonObject = JSON.parse(json);
      var instance = new this();
      instance._totalExVatAndDiscounts = jsonObject.totalExVatAndDiscounts;
      instance._totalExVatAndDiscountsFormatted = jsonObject.totalExVatAndDiscountsFormatted;
      instance._totalExVat = jsonObject.totalExVat;
      instance._totalExVatFormatted = jsonObject.totalExVatFormatted;
      instance._vatTotal = jsonObject.vatTotal;
      instance._vatTotalFormatted = jsonObject.vatTotalFormatted;
      instance._shippingCosts = jsonObject.shippingCosts;
      instance._shippingCostsFormatted = jsonObject.shippingCostsFormatted;
      instance._total = jsonObject.total;
      instance._totalFormatted = jsonObject.totalFormatted;
      instance._vatPercentage = jsonObject.vatPercentage;
      instance._couponCodes = jsonObject.couponCodes;
      return instance;
    }
    /**
     * Checks that the given json string represents a CheckoutInformationResponse
     *
     * @param {string} json
     * @param {boolean} logErrors
     * @return {boolean}
     */

  }, {
    key: "is",
    value: function is(json) {
      var logErrors = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
      var jsonObject = null;

      try {
        jsonObject = JSON.parse(json);
        if (!jsonObject) return false;
      } catch (e) {
        if (logErrors) console.error('CheckoutInformationResponse: The given json does not represent a valid CheckoutInformationResponse since the json string was not a valid json');
        return false;
      }

      if (!jsonObject.hasOwnProperty('totalExVatFormatted') || typeof jsonObject.totalExVatFormatted !== 'string') {
        if (logErrors) console.error('CheckoutInformationResponse: The response object must have a totalExVatFormatted property that is a string. Object: ', jsonObject);
        return false;
      }

      if (!jsonObject.hasOwnProperty('totalExVatAndDiscountsFormatted') || typeof jsonObject.totalExVatAndDiscountsFormatted !== 'string') {
        if (logErrors) console.error('CheckoutInformationResponse: The response object must have a totalExVatAndDiscountsFormatted property that is a string. Object: ', jsonObject);
        return false;
      }

      if (!jsonObject.hasOwnProperty('vatTotalFormatted') || typeof jsonObject.vatTotalFormatted !== 'string') {
        if (logErrors) console.error('CheckoutInformationResponse: The response object must have a vatTotalFormatted property that is a string. Object: ', jsonObject);
        return false;
      }

      if (!jsonObject.hasOwnProperty('shippingCostsFormatted') || typeof jsonObject.shippingCostsFormatted !== 'string') {
        if (logErrors) console.error('CheckoutInformationResponse: The response object must have a shippingCostsFormatted property that is a string. Object: ', jsonObject);
        return false;
      }

      if (!jsonObject.hasOwnProperty('totalFormatted') || typeof jsonObject.totalFormatted !== 'string') {
        if (logErrors) console.error('CheckoutInformationResponse: The response object must have a totalFormatted property that is a string. Object: ', jsonObject);
        return false;
      }

      if (!jsonObject.hasOwnProperty('totalExVatAndDiscounts') || typeof jsonObject.totalExVatAndDiscounts !== 'number') {
        if (logErrors) console.error('CheckoutInformationResponse: The response object must have a totalExVatAndDiscounts property that is a number. Object: ', jsonObject);
        return false;
      }

      if (!jsonObject.hasOwnProperty('totalExVat') || typeof jsonObject.totalExVat !== 'number') {
        if (logErrors) console.error('CheckoutInformationResponse: The response object must have a totalExVat property that is a number. Object: ', jsonObject);
        return false;
      }

      if (!jsonObject.hasOwnProperty('vatTotal') || typeof jsonObject.vatTotal !== 'number') {
        if (logErrors) console.error('CheckoutInformationResponse: The response object must have a vatTotal property that is a number. Object: ', jsonObject);
        return false;
      }

      if (!jsonObject.hasOwnProperty('shippingCosts') || typeof jsonObject.shippingCosts !== 'number') {
        if (logErrors) console.error('CheckoutInformationResponse: The response object must have a shippingCosts property that is a number. Object: ', jsonObject);
        return false;
      }

      if (!jsonObject.hasOwnProperty('total') || typeof jsonObject.total !== 'number') {
        if (logErrors) console.error('CheckoutInformationResponse: The response object must have a total property that is a number. Object: ', jsonObject);
        return false;
      }

      if (!jsonObject.hasOwnProperty('vatPercentage') || typeof jsonObject.vatPercentage !== 'number') {
        if (logErrors) console.error('CheckoutInformationResponse: The response object must have a vatPercentage property that is a number. Object: ', jsonObject);
        return false;
      }

      if (!jsonObject.hasOwnProperty('couponCodes') || !Array.isArray(jsonObject.couponCodes)) {
        if (logErrors) console.error('CheckoutInformationResponse: The response object must have a couponCodes property that is an array. Object: ', jsonObject);
        return false;
      }

      return true;
    }
  }]);

  return CheckoutInformationResponse;
}();



/***/ }),

/***/ "./resources/js/global/models/countryLanguagesResponse.js":
/*!****************************************************************!*\
  !*** ./resources/js/global/models/countryLanguagesResponse.js ***!
  \****************************************************************/
/*! exports provided: CountryLanguagesResponse */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CountryLanguagesResponse", function() { return CountryLanguagesResponse; });
/* harmony import */ var _language__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./language */ "./resources/js/global/models/language.js");
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

/**
 * CountryLanguagesResponse.
 *
 * Represents a response that originates from
 */


var CountryLanguagesResponse =
/*#__PURE__*/
function () {
  function CountryLanguagesResponse() {
    _classCallCheck(this, CountryLanguagesResponse);

    this._languages = [];
  }
  /**
   * @param {string} json
   * @return {CountryLanguagesResponse|null}
   */


  _createClass(CountryLanguagesResponse, [{
    key: "_toJson",

    /**
     * @return {{valid: boolean, errors: Array}}
     * @private
     */
    value: function _toJson() {
      return {
        'languages': this._languages
      };
    }
    /**
     * @return {Language[]}
     */

  }, {
    key: "languages",
    get: function get() {
      return this._languages;
    }
  }], [{
    key: "fromJsonString",
    value: function fromJsonString(json) {
      if (!this.is(json)) {
        return null;
      }

      var jsonObject = JSON.parse(json);
      var instance = new this();
      var languageCount = jsonObject.languages.length;

      for (var index = 0; index < languageCount; index++) {
        var languageObject = jsonObject.languages[index];
        var language = new _language__WEBPACK_IMPORTED_MODULE_0__["Language"]();
        language.name = languageObject.name;
        language.displayName = languageObject.displayName;
        language.nativeName = languageObject.nativeName;
        language.twoLetterIsoLanguageName = languageObject.twoLetterIsoLanguageName;
        language.threeLetterIsoLanguageName = languageObject.threeLetterIsoLanguageName;

        instance._languages.push(language);
      }

      return instance;
    }
    /**
     * Checks that the given json string represents a ErrorResponse
     *
     * @param {string} json
     * @param {boolean} logErrors
     * @return {boolean}
     */

  }, {
    key: "is",
    value: function is(json) {
      var logErrors = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
      var jsonObject = null;

      if (typeof json === 'string') {
        try {
          jsonObject = JSON.parse(json);
          if (!jsonObject) return false;
        } catch (e) {
          console.error('CountryLanguagesResponse: The given json does not represent a CountryLanguagesResponse since the json string was not a valid json. Object: ', jsonObject);
          return false;
        }
      } else {
        jsonObject = json;
      }

      if (!jsonObject.hasOwnProperty('languages') || !Array.isArray(jsonObject.languages)) {
        console.log('CountryLanguagesResponse: The given json must have a property called languages that is an Array, But did not have. Object: ', jsonObject);
        return false;
      }

      var languageCount = jsonObject.languages.length;

      for (var index = 0; index < languageCount; index++) {
        var languageObject = jsonObject.languages[index];

        if (_typeof(languageObject) !== 'object' || typeof languageObject === 'function' || !_language__WEBPACK_IMPORTED_MODULE_0__["Language"].is(languageObject)) {
          return false;
        }
      }

      return true;
    }
  }]);

  return CountryLanguagesResponse;
}();



/***/ }),

/***/ "./resources/js/global/models/errorResponse.js":
/*!*****************************************************!*\
  !*** ./resources/js/global/models/errorResponse.js ***!
  \*****************************************************/
/*! exports provided: ErrorResponse */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ErrorResponse", function() { return ErrorResponse; });
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

/**
 * A laravel error response
 */
var ErrorResponse =
/*#__PURE__*/
function () {
  function ErrorResponse() {
    _classCallCheck(this, ErrorResponse);

    this._message = '';
    this._errors = {};
  }
  /**
   * @param {string} json
   * @return {ErrorResponse|null}
   */


  _createClass(ErrorResponse, [{
    key: "message",

    /**
     * Retrurns a comprehensive error message for all the fields.
     *
     * @return {string}
     */
    get: function get() {
      return this._message;
    }
    /**
     * @return {Object} returns an object where the property are field names. and the values are arrays containing errors for those field names.
     */

  }, {
    key: "errors",
    get: function get() {
      return this._errors;
    }
  }], [{
    key: "fromJsonString",
    value: function fromJsonString(json) {
      if (!this.is(json)) {
        return null;
      }

      var jsonObject = JSON.parse(json);
      var instance = new this();
      instance._message = jsonObject.message;
      instance._errors = jsonObject.errors;
      return instance;
    }
    /**
     * Checks that the given json string represents a ErrorResponse
     *
     * @param {string} json
     * @param {boolean} logErrors
     * @return {boolean}
     */

  }, {
    key: "is",
    value: function is(json) {
      var logErrors = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
      var jsonObject = null;

      try {
        jsonObject = JSON.parse(json);
        if (!jsonObject) return false;
      } catch (e) {
        if (logErrors) console.error('ErrorResponse: The given json does not represent a valid ErrorResponse since the json string was not a valid json');
        return false;
      }

      if (!jsonObject.hasOwnProperty('message') || typeof jsonObject.message !== 'string') {
        if (logErrors) console.error('ErrorResponse: The response object must have an message property that is a string. Object:', jsonObject);
        return false;
      }

      if (!jsonObject.hasOwnProperty('errors') || _typeof(jsonObject.errors) !== 'object') {
        if (logErrors) console.error('ErrorResponse: The response object must have an errors object that represents valid laravel field errors. Object:', jsonObject);
        return false;
      }

      for (var fieldName in jsonObject.errors) {
        if (jsonObject.errors.hasOwnProperty(fieldName) && !Array.isArray(jsonObject.errors[fieldName])) {
          if (logErrors) console.error('ErrorResponse: The property "' + fieldName + '" in the errors array must have have array as value containing errors strings. Object:', jsonObject);
          return false;
        }
      }

      return true;
    }
  }]);

  return ErrorResponse;
}();



/***/ }),

/***/ "./resources/js/global/models/language.js":
/*!************************************************!*\
  !*** ./resources/js/global/models/language.js ***!
  \************************************************/
/*! exports provided: Language */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Language", function() { return Language; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

/**
 * Language.
 *
 * Represents a Language
 */
var Language =
/*#__PURE__*/
function () {
  function Language() {
    _classCallCheck(this, Language);

    this._name = '';
    this._displayName = '';
    this._nativeName = '';
    this._twoLetterIsoLanguageName = '';
    this._threeLetterIsoLanguageName = '';
  }
  /**
   * @param {string} json
   * @return {Language|null}
   */


  _createClass(Language, [{
    key: "_toJson",

    /**
     * @return {{valid: boolean, errors: Array}}
     * @private
     */
    value: function _toJson() {
      return {
        'name': this._name,
        'displayName': this._displayName,
        'nativeName': this._nativeName,
        'twoLetterIsoLanguageName': this._twoLetterIsoLanguageName,
        'threeLetterIsoLanguageName': this._threeLetterIsoLanguageName
      };
    }
  }, {
    key: "name",
    get: function get() {
      return this._name;
    },
    set: function set(value) {
      this._name = value;
    }
  }, {
    key: "displayName",
    get: function get() {
      return this._displayName;
    },
    set: function set(value) {
      this._displayName = value;
    }
  }, {
    key: "nativeName",
    get: function get() {
      return this._nativeName;
    },
    set: function set(value) {
      this._nativeName = value;
    }
  }, {
    key: "twoLetterIsoLanguageName",
    get: function get() {
      return this._twoLetterIsoLanguageName;
    },
    set: function set(value) {
      this._twoLetterIsoLanguageName = value;
    }
  }, {
    key: "threeLetterIsoLanguageName",
    get: function get() {
      return this._threeLetterIsoLanguageName;
    },
    set: function set(value) {
      this._threeLetterIsoLanguageName = value;
    }
  }], [{
    key: "fromJsonString",
    value: function fromJsonString(json) {
      if (!this.is(json)) {
        return null;
      }

      var jsonObject = JSON.parse(json);
      var instance = new this();
      instance._name = jsonObject.name;
      instance._displayName = jsonObject.displayName;
      instance._nativeName = jsonObject.nativeName;
      instance._twoLetterIsoLanguageName = jsonObject.twoLetterIsoLanguageName;
      instance._threeLetterIsoLanguageName = jsonObject.threeLetterIsoLanguageName;
      return instance;
    }
    /**
     * Checks that the given json string represents a ErrorResponse
     *
     * @param {string|object} json
     * @param {boolean} logErrors
     * @return {boolean}
     */

  }, {
    key: "is",
    value: function is(json) {
      var logErrors = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
      var jsonObject = null;

      if (typeof json === 'string') {
        try {
          jsonObject = JSON.parse(json);
          if (!jsonObject) return false;
        } catch (e) {
          console.error('Language: The given json does not represent a Language since the json string was not a valid json. Object: ', jsonObject, json);
          return false;
        }
      } else {
        jsonObject = json;
      }

      if (!jsonObject.hasOwnProperty('name') || typeof jsonObject.displayName !== 'string') {
        if (logErrors) console.error('Language: The language object must have a property called name that is a string. Object: ', jsonObject);
        return false;
      }

      if (!jsonObject.hasOwnProperty('displayName') || typeof jsonObject.displayName !== 'string') {
        if (logErrors) console.error('Language: The language object must have a property called displayName that is a string. Object: ', jsonObject);
        return false;
      }

      if (!jsonObject.hasOwnProperty('nativeName') || typeof jsonObject.nativeName !== 'string') {
        if (logErrors) console.error('Language: The language object must have a property called nativeName that is a string. Object: ', jsonObject);
        return false;
      }

      if (!jsonObject.hasOwnProperty('twoLetterIsoLanguageName') || typeof jsonObject.twoLetterIsoLanguageName !== 'string') {
        if (logErrors) console.error('Language: The language object must have a property called twoLetterIsoLanguageName that is a string. Object: ', jsonObject.twoLetterIsoLanguageName);
        return false;
      }

      if (!jsonObject.hasOwnProperty('threeLetterIsoLanguageName') || typeof jsonObject.threeLetterIsoLanguageName !== 'string') {
        if (logErrors) console.error('Language: The language object must have a property called threeLetterIsoLanguageName that is a string. Object: ', jsonObject);
        return false;
      }

      return true;
    }
  }]);

  return Language;
}();



/***/ }),

/***/ "./resources/js/global/models/validationResponse.js":
/*!**********************************************************!*\
  !*** ./resources/js/global/models/validationResponse.js ***!
  \**********************************************************/
/*! exports provided: ValidationResponse */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ValidationResponse", function() { return ValidationResponse; });
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

/**
 * ValidationResponse.
 *
 * Represents a response that originates from
 */
var ValidationResponse =
/*#__PURE__*/
function () {
  function ValidationResponse() {
    _classCallCheck(this, ValidationResponse);

    this._valid = false;
    this._errors = [];
    this.toJSON = this._toJson.bind(this);
  }
  /**
   * @param {string} json
   * @return {ValidationResponse|null}
   */


  _createClass(ValidationResponse, [{
    key: "_toJson",

    /**
     * @return {{valid: boolean, errors: Array}}
     * @private
     */
    value: function _toJson() {
      return {
        'valid': this._valid,
        'errors': this._errors
      };
    }
    /**
     * @return {boolean}
     */

  }, {
    key: "valid",
    get: function get() {
      return this._valid;
    }
    /**
     * @return {Array}
     */

  }, {
    key: "errors",
    get: function get() {
      return this._errors;
    }
  }], [{
    key: "fromJsonString",
    value: function fromJsonString(json) {
      if (!this.is(json)) {
        return null;
      }

      var jsonObject = JSON.parse(json);
      var instance = new this();
      instance._valid = jsonObject.valid;
      instance._errors = jsonObject.errors;
      return instance;
    }
    /**
     * Checks that the given json string represents a ErrorResponse
     *
     * @param {string} json
     * @param {boolean} logErrors
     * @return {boolean}
     */

  }, {
    key: "is",
    value: function is(json) {
      var logErrors = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
      var jsonObject = null;

      try {
        jsonObject = JSON.parse(json);
        if (!jsonObject) return false;
      } catch (e) {
        console.error('ValidationResponse: The given json does not represent a ValidationResponse since the json string was not a valid json. Object: ', jsonObject);
        return false;
      }

      if (!jsonObject.hasOwnProperty('valid')) {
        console.error('ValidationResponse: The given json object must have an "valid" property that is a string. But did not have one. Object: ', jsonObject);
        return false;
      }

      if (!jsonObject.hasOwnProperty('errors') || _typeof(!jsonObject.errors) == 'object') {
        console.error('ValidationResponse: The given json object must have an errors object. But did not have one. Object: ', jsonObject);
        return false;
      }

      return true;
    }
  }]);

  return ValidationResponse;
}();



/***/ }),

/***/ "./resources/js/global/polyfills/eventPolyFill.js":
/*!********************************************************!*\
  !*** ./resources/js/global/polyfills/eventPolyFill.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/**
 * Event semi polyfill. IE does not support new event. But does support document.createEvent.
 * Same thing for dispatching events. But then with createEvent and fireEvent.
 */
function createNewEvent(eventName) {
  var event;

  if (typeof Event === 'function') {
    //On ie it is typeOf object.
    event = new Event(eventName); //Non-ie
  } else {
    event = document.createEvent('Event'); //ie

    event.initEvent(eventName, true, true);
  }

  return event;
}

function dispatchEventForElement(element, event) {
  if (document.createEvent) {
    element.dispatchEvent(event);
  } else {
    element.fireEvent("on" + event.eventType, event);
  }
}

/***/ }),

/***/ "./resources/js/global/polyfills/isInteger.js":
/*!****************************************************!*\
  !*** ./resources/js/global/polyfills/isInteger.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

Number.isInteger = Number.isInteger || function (value) {
  return typeof value === "number" && isFinite(value) && Math.floor(value) === value;
};

/***/ }),

/***/ "./resources/js/global/polyfills/promise.js":
/*!**************************************************!*\
  !*** ./resources/js/global/polyfills/promise.js ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(setImmediate, global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

(function (global, factory) {
  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? factory() :  true ? !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
				(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :
				__WEBPACK_AMD_DEFINE_FACTORY__),
				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;
})(this, function () {
  'use strict';
  /**
   * @this {Promise}
   */

  function finallyConstructor(callback) {
    var constructor = this.constructor;
    return this.then(function (value) {
      return constructor.resolve(callback()).then(function () {
        return value;
      });
    }, function (reason) {
      return constructor.resolve(callback()).then(function () {
        return constructor.reject(reason);
      });
    });
  } // Store setTimeout reference so promise-polyfill will be unaffected by
  // other code modifying setTimeout (like sinon.useFakeTimers())


  var setTimeoutFunc = setTimeout;

  function noop() {} // Polyfill for Function.prototype.bind


  function bind(fn, thisArg) {
    return function () {
      fn.apply(thisArg, arguments);
    };
  }
  /**
   * @constructor
   * @param {Function} fn
   */


  function Promise(fn) {
    if (!(this instanceof Promise)) throw new TypeError('Promises must be constructed via new');
    if (typeof fn !== 'function') throw new TypeError('not a function');
    /** @type {!number} */

    this._state = 0;
    /** @type {!boolean} */

    this._handled = false;
    /** @type {Promise|undefined} */

    this._value = undefined;
    /** @type {!Array<!Function>} */

    this._deferreds = [];
    doResolve(fn, this);
  }

  function handle(self, deferred) {
    while (self._state === 3) {
      self = self._value;
    }

    if (self._state === 0) {
      self._deferreds.push(deferred);

      return;
    }

    self._handled = true;

    Promise._immediateFn(function () {
      var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;

      if (cb === null) {
        (self._state === 1 ? resolve : reject)(deferred.promise, self._value);
        return;
      }

      var ret;

      try {
        ret = cb(self._value);
      } catch (e) {
        reject(deferred.promise, e);
        return;
      }

      resolve(deferred.promise, ret);
    });
  }

  function resolve(self, newValue) {
    try {
      // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
      if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.');

      if (newValue && (_typeof(newValue) === 'object' || typeof newValue === 'function')) {
        var then = newValue.then;

        if (newValue instanceof Promise) {
          self._state = 3;
          self._value = newValue;
          finale(self);
          return;
        } else if (typeof then === 'function') {
          doResolve(bind(then, newValue), self);
          return;
        }
      }

      self._state = 1;
      self._value = newValue;
      finale(self);
    } catch (e) {
      reject(self, e);
    }
  }

  function reject(self, newValue) {
    self._state = 2;
    self._value = newValue;
    finale(self);
  }

  function finale(self) {
    if (self._state === 2 && self._deferreds.length === 0) {
      Promise._immediateFn(function () {
        if (!self._handled) {
          Promise._unhandledRejectionFn(self._value);
        }
      });
    }

    for (var i = 0, len = self._deferreds.length; i < len; i++) {
      handle(self, self._deferreds[i]);
    }

    self._deferreds = null;
  }
  /**
   * @constructor
   */


  function Handler(onFulfilled, onRejected, promise) {
    this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
    this.onRejected = typeof onRejected === 'function' ? onRejected : null;
    this.promise = promise;
  }
  /**
   * Take a potentially misbehaving resolver function and make sure
   * onFulfilled and onRejected are only called once.
   *
   * Makes no guarantees about asynchrony.
   */


  function doResolve(fn, self) {
    var done = false;

    try {
      fn(function (value) {
        if (done) return;
        done = true;
        resolve(self, value);
      }, function (reason) {
        if (done) return;
        done = true;
        reject(self, reason);
      });
    } catch (ex) {
      if (done) return;
      done = true;
      reject(self, ex);
    }
  }

  Promise.prototype['catch'] = function (onRejected) {
    return this.then(null, onRejected);
  };

  Promise.prototype.then = function (onFulfilled, onRejected) {
    // @ts-ignore
    var prom = new this.constructor(noop);
    handle(this, new Handler(onFulfilled, onRejected, prom));
    return prom;
  };

  Promise.prototype['finally'] = finallyConstructor;

  Promise.all = function (arr) {
    return new Promise(function (resolve, reject) {
      if (!arr || typeof arr.length === 'undefined') throw new TypeError('Promise.all accepts an array');
      var args = Array.prototype.slice.call(arr);
      if (args.length === 0) return resolve([]);
      var remaining = args.length;

      function res(i, val) {
        try {
          if (val && (_typeof(val) === 'object' || typeof val === 'function')) {
            var then = val.then;

            if (typeof then === 'function') {
              then.call(val, function (val) {
                res(i, val);
              }, reject);
              return;
            }
          }

          args[i] = val;

          if (--remaining === 0) {
            resolve(args);
          }
        } catch (ex) {
          reject(ex);
        }
      }

      for (var i = 0; i < args.length; i++) {
        res(i, args[i]);
      }
    });
  };

  Promise.resolve = function (value) {
    if (value && _typeof(value) === 'object' && value.constructor === Promise) {
      return value;
    }

    return new Promise(function (resolve) {
      resolve(value);
    });
  };

  Promise.reject = function (value) {
    return new Promise(function (resolve, reject) {
      reject(value);
    });
  };

  Promise.race = function (values) {
    return new Promise(function (resolve, reject) {
      for (var i = 0, len = values.length; i < len; i++) {
        values[i].then(resolve, reject);
      }
    });
  }; // Use polyfill for setImmediate for performance gains


  Promise._immediateFn = typeof setImmediate === 'function' && function (fn) {
    setImmediate(fn);
  } || function (fn) {
    setTimeoutFunc(fn, 0);
  };

  Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {
    if (typeof console !== 'undefined' && console) {
      console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console
    }
  };
  /** @suppress {undefinedVars} */


  var globalNS = function () {
    // the only reliable means to get the global object is
    // `Function('return this')()`
    // However, this causes CSP violations in Chrome apps.
    if (typeof self !== 'undefined') {
      return self;
    }

    if (typeof window !== 'undefined') {
      return window;
    }

    if (typeof global !== 'undefined') {
      return global;
    }

    throw new Error('unable to locate global object');
  }();

  if (!('Promise' in globalNS)) {
    globalNS['Promise'] = Promise;
  } else if (!globalNS.Promise.prototype['finally']) {
    globalNS.Promise.prototype['finally'] = finallyConstructor;
  }
});
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/timers-browserify/main.js */ "./node_modules/timers-browserify/main.js").setImmediate, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))

/***/ }),

/***/ "./resources/js/shop/components/checkoutController.js":
/*!************************************************************!*\
  !*** ./resources/js/shop/components/checkoutController.js ***!
  \************************************************************/
/*! exports provided: CheckoutController */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CheckoutController", function() { return CheckoutController; });
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js");
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _global_models_address__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../global/models/address */ "./resources/js/global/models/address.js");
/* harmony import */ var _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../global/models/errorResponse */ "./resources/js/global/models/errorResponse.js");
/* harmony import */ var _shoppingcartService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./shoppingcartService */ "./resources/js/shop/components/shoppingcartService.js");
/* harmony import */ var _checkoutService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./checkoutService */ "./resources/js/shop/components/checkoutService.js");
/* harmony import */ var _validationService__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./validationService */ "./resources/js/shop/components/validationService.js");


function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }






/**
 * Controls the checkout form
 */

var CheckoutController =
/*#__PURE__*/
function () {
  /**
   * @param {HTMLDivElement} checkoutFormDivElement
   * @param {ShoppingcartService} shoppingcartService
   * @param {CheckoutService} checkoutService
   * @param {ValidationService} validationService
   * @param {GlobalisationService|null} globalisationService
   * @param {ErrorController|null} errorFormController
   */
  function CheckoutController(checkoutFormDivElement, shoppingcartService, checkoutService, validationService, globalisationService, errorFormController) {
    _classCallCheck(this, CheckoutController);

    var self = this; //Select some elements

    if (!checkoutFormDivElement || checkoutFormDivElement.tagName !== "FORM") {
      console.error('CheckoutController: Expecting a form element upon construction that holds all checkout form elements. CheckoutController stopped working');
      return;
    }

    this._checkoutForm = checkoutFormDivElement; //Select elements.

    if (!this.selectAndValidateElement('.js-add-coupon', 'BUTTON', function (element) {
      self._addCouponButton = element;
    })) return;
    if (!this.selectAndValidateElement('.js-coupon input', 'INPUT', function (element) {
      self._couponInput = element;
    })) return;
    if (!this.selectAndValidateElement('.js-coupon-codes', 'UL', function (element) {
      self._couponCodesList = element;
    })) return;
    if (!this.selectAndValidateElement('.js-submit', 'INPUT', function (element) {
      self._submitButton = element;
    })) return;
    if (!this.selectAndValidateElement('.js-total-ex-vat-and-discounts', 'TD', function (element) {
      self._totalExVatAndDiscountsContainer = element;
    })) return;
    if (!this.selectAndValidateElement('.js-total-ex-vat', 'TD', function (element) {
      self._totalExVatContainer = element;
    })) return;
    if (!this.selectAndValidateElement('.js-vat-total', 'SPAN', function (element) {
      self._vatContainer = element;
    })) return;
    if (!this.selectAndValidateElement('.js-vat-percentage', 'SPAN', function (element) {
      self._vatPercentageContainer = element;
    })) return;
    if (!this.selectAndValidateElement('.js-shipping-costs', 'TD', function (element) {
      self._shippingCostsContainer = element;
    })) return;
    if (!this.selectAndValidateElement('.js-total', 'TD', function (element) {
      self._totalContainer = element;
    })) return; //Select optional elements

    this._guestLanguageSelectWrapper = this._checkoutForm.querySelector('.js-language-select-wrapper'); //Check that we have the shopping cart service

    this._checkoutService = checkoutService;

    if (!checkoutService || !(checkoutService instanceof _checkoutService__WEBPACK_IMPORTED_MODULE_4__["CheckoutService"])) {
      console.error('CheckoutController: The CheckoutController was expected to get an instance of CheckoutService, but did not get one.');
      return;
    }

    this._globalisationService = globalisationService;

    if (!globalisationService) {
      console.error('RegisterController: The Register form was expected to get an instance of RegisterService, but did not get one.');
      return;
    } //Check that we have the shopping cart service


    this._shoppingcartService = shoppingcartService;

    if (!shoppingcartService || !(shoppingcartService instanceof _shoppingcartService__WEBPACK_IMPORTED_MODULE_3__["ShoppingcartService"])) {
      console.error('CheckoutController: The CheckoutController was expected to get an instance of ShoppingcartService, but did not get one.');
      return;
    } //Check that we have the shopping cart service


    this._validationService = validationService;

    if (!validationService || !(validationService instanceof _validationService__WEBPACK_IMPORTED_MODULE_5__["ValidationService"])) {
      console.error('CheckoutController: The CheckoutController was expected to get an instance of validationService, but did not get one.');
      return;
    } //Bind the error list controller if we have any.


    this._errorFormController = errorFormController;

    if (!this._errorFormController && !(errorFormController instanceof ErrorFormController)) {
      console.error('CheckoutController: If you specify an errorFormController, it must be an instance of errorFormController');
      return;
    }

    this._domParser = new DOMParser();
    this._hiddenClass = 'u-hidden'; //The name of a class that can be applied to things to hide them.
    //Bind event listeners to this class.

    this._formSubmit = this._formSubmit.bind(this);
    this._formChanged = this._formChanged.bind(this);
    this._removeCouponCodeClicked = this._removeCouponCodeClicked.bind(this);
    this._handleErrorResponse = this._handleErrorResponse.bind(this); //Bind other function to this class

    this._createHtmlElementFromString = this._createHtmlElementFromString.bind(this); //Enable the listeners.

    this.controlListeners(true);

    this._guestCountryChanged();
  }
  /**
   * @param {string} selector
   * @param {string} tagName
   * @param {function} validCallBack. Called with the found valid element.
   * @return {boolean}
   */


  _createClass(CheckoutController, [{
    key: "selectAndValidateElement",
    value: function selectAndValidateElement(selector, tagName, validCallBack) {
      var element = this._checkoutForm.querySelector(selector);

      if (!element || element.tagName !== tagName) {
        console.error('CheckoutController: Expecting the CheckoutFormDivElement to have an ' + tagName + ' with selector ' + selector + '. But could not find that element. CheckoutController stopped working');
        return false;
      }

      validCallBack.call(this, element);
      return true;
    }
    /**
     * @param {boolean} enabled
     */

  }, {
    key: "controlListeners",
    value: function controlListeners(enabled) {
      var self = this;

      this._submitButton.removeEventListener('click', this._formSubmit);

      this._addCouponButton.removeEventListener('click', this._formSubmit);

      this._checkoutForm.removeEventListener('change', this._formChanged);

      this._couponCodesList.querySelectorAll('.delete').forEach(function (deleteButtonElement) {
        deleteButtonElement.removeEventListener('click', self._removeCouponCodeClicked);
      });

      if (enabled) {
        this._submitButton.addEventListener('click', this._formSubmit);

        this._addCouponButton.addEventListener('click', this._formSubmit);

        this._checkoutForm.addEventListener('change', this._formChanged);

        this._couponCodesList.querySelectorAll('.delete').forEach(function (deleteButtonElement) {
          deleteButtonElement.addEventListener('click', self._removeCouponCodeClicked);
        });
      }
    }
    /**
     * Triggered on form submit. When this returns false, the form won't be submitted.
     * We mainly use it for validation
     *
     * @private
     * @param {Event} event
     * @return {boolean}
     */

  }, {
    key: "_formSubmit",
    value: function () {
      var _formSubmit2 = _asyncToGenerator(
      /*#__PURE__*/
      _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(event) {
        var self;
        return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                //Cancel the event. We need to check if the country is valid first
                event.preventDefault();
                self = this;

                if (event.currentTarget.classList.contains('js-submit')) {
                  this._validateForm().then(function () {
                    self._checkoutForm.submit();
                  })["catch"](function () {});
                } else if (event.currentTarget.classList.contains('js-add-coupon')) {
                  this._addCouponCode().then(function (coupon) {
                    console.log('adding coupon to list for user');
                  })["catch"](function () {});
                }

                return _context.abrupt("return", false);

              case 4:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function _formSubmit(_x) {
        return _formSubmit2.apply(this, arguments);
      }

      return _formSubmit;
    }()
    /**
     * @param {Event} event
     * @return {boolean}
     * @private
     */

  }, {
    key: "_formChanged",
    value: function _formChanged(event) {
      // this._validateForm().catch(function() {});
      if (event.target.name) {
        if (event.target.name.includes('shipping')) {
          //One of the shipping inputs has been changed
          this._updateShippingCosts();
        } else if (event.target.name === 'country') {
          this._guestCountryChanged();
        }
      }
    }
    /**
     * Update the shipping costs.
     */

  }, {
    key: "_updateShippingCosts",
    value: function _updateShippingCosts() {
      var self = this;
      var formData = new FormData(this._checkoutForm);
      var address = new _global_models_address__WEBPACK_IMPORTED_MODULE_1__["Address"]();
      address.street = formData.get('shipping_street');
      address.house_number = formData.get('shipping_house_number');
      address.postal_code = formData.get('shipping_postal_code');
      address.city = formData.get('shipping_city');
      address.phone = formData.get('shipping_phone');
      address.countryIso3 = formData.get('shipping_country');
      console.log('updating shipping costs for address: ', address);

      this._checkoutService.setShippingAddress(address).then(function () {})["catch"](function (response) {
        /** @param {ErrorResponse} response **/
        self._handleErrorResponse(response);
      })["finally"](function () {
        self._checkoutService.getCheckoutInformation().then(
        /** @param {CheckoutInformationResponse} checkoutInformationResponse **/
        function (checkoutInformationResponse) {
          self._updateFormUsingCheckoutInformationResponse(checkoutInformationResponse);
        });
      });
    }
    /**
     * @param {CheckoutInformationResponse} checkoutInformationResponse
     * @private
     */

  }, {
    key: "_updateFormUsingCheckoutInformationResponse",
    value: function _updateFormUsingCheckoutInformationResponse(checkoutInformationResponse) {
      console.log('update form');
      var self = this;
      this._totalExVatAndDiscountsContainer.innerHTML = checkoutInformationResponse.totalExVatAndDiscountsFormatted;
      this._totalExVatContainer.innerHTML = checkoutInformationResponse.totalExVatFormatted;
      this._vatContainer.innerHTML = checkoutInformationResponse.vatTotalFormatted;
      this._vatPercentageContainer.innerHTML = checkoutInformationResponse.vatPercentage;
      this._shippingCostsContainer.innerHTML = checkoutInformationResponse.shippingCostsFormatted;
      this._totalContainer.innerHTML = checkoutInformationResponse.totalFormatted; //Delete all coupon codes

      while (this._couponCodesList.children.length > 0) {
        this._couponCodesList.removeChild(self._couponCodesList.firstChild);
      } //Add the coupon codes


      checkoutInformationResponse.couponCodes.forEach(function (couponCode) {
        var couponCodeListItem = self._createHtmlElementFromString('<li data-code="' + couponCode + '" dusk="' + couponCode + '">' + couponCode + '<span class="delete">&times;</span></li>');

        self._couponCodesList.appendChild(couponCodeListItem);

        couponCodeListItem.querySelector('.delete').addEventListener('click', self._removeCouponCodeClicked);
      });
    }
    /**
     * @return {Promise<> | Promise}
     * @private
     */

  }, {
    key: "_validateForm",
    value: function _validateForm() {
      var self = this;
      return new Promise(function (resolve, reject) {
        var formData = new FormData(self._checkoutForm);

        self._validationService.validateCheckoutForm(formData).then(function () {
          if (self._errorFormController) self._errorFormController.clearAllErrors();
          resolve();
        })["catch"](
        /** @param {ErrorResponse} errorResponse  **/
        function (errorResponse) {
          //Logging is handled in the validationService
          if (self._errorFormController) self._errorFormController.clearAllErrors();

          self._handleErrorResponse(errorResponse);

          reject();
        });
      });
    }
    /**
     * Tries to add a coupon code.
     *
     * @return {Promise<> | Promise}
     * @private
     */

  }, {
    key: "_addCouponCode",
    value: function _addCouponCode() {
      var self = this;
      return new Promise(function (resolve, reject) {
        var enteredCoupon = self._couponInput.value;

        self._checkoutService.addCoupon(enteredCoupon).then(
        /** @param {CheckoutInformationResponse} checkoutInformationResponse  **/
        function (checkoutInformationResponse) {
          if (self._errorFormController) self._errorFormController.clearAllErrors();

          self._updateFormUsingCheckoutInformationResponse(checkoutInformationResponse);

          self._couponInput.value = '';
          resolve(enteredCoupon);
        })["catch"](
        /** @param {ErrorResponse} errorResponse  **/
        function (errorResponse) {
          //Logging is handled in the validationService
          if (self._errorFormController) self._errorFormController.clearAllErrors();

          self._handleErrorResponse(errorResponse);

          reject();
        });
      });
    }
    /**
     * @private
     * @param {string} couponCode
     */

  }, {
    key: "_removeCouponCode",
    value: function _removeCouponCode(couponCode) {
      var self = this;
      return new Promise(function (resolve, reject) {
        self._checkoutService.removeCoupon(couponCode).then(
        /** @param {CheckoutInformationResponse} checkoutInformationResponse **/
        function (checkoutInformationResponse) {
          if (self._errorFormController) self._errorFormController.clearAllErrors();

          self._updateFormUsingCheckoutInformationResponse(checkoutInformationResponse);

          resolve(couponCode);
        })["catch"](
        /** @param {ErrorResponse} errorResponse  **/
        function (errorResponse) {
          //Logging is handled in the validationService
          if (self._errorFormController) self._errorFormController.clearAllErrors();

          self._handleErrorResponse(errorResponse);

          reject();
        });
      });
    }
    /**
     * @param {Event} event
     * @private
     */

  }, {
    key: "_removeCouponCodeClicked",
    value: function _removeCouponCodeClicked(event) {
      var code = event.currentTarget.parentElement.dataset.code;

      this._removeCouponCode(code).then(function () {})["catch"](function () {});
    }
    /**
     * Updates the guest language select
     *
     * @private
     */

  }, {
    key: "_guestCountryChanged",
    value: function _guestCountryChanged() {
      var formData = new FormData(this._checkoutForm);

      var select = this._guestLanguageSelectWrapper.querySelector('select[name="language"]');

      if (!formData.has('country') || !this._guestLanguageSelectWrapper || !select) return; //Do nothing if the user is authenticated (not a guest).

      var countryIso3 = formData.get('country');
      var self = this;

      this._globalisationService.getLanguagesForCountryWithIso3(countryIso3).then(
      /** @param { CountryLanguagesResponse } countryLanguagesResponse **/
      function (countryLanguagesResponse) {
        self._clearLanguageSelect();

        var languageCount = countryLanguagesResponse.languages.length;

        for (var index = 0; index < languageCount; index++) {
          var language = countryLanguagesResponse.languages[index];

          var optionElement = self._createHtmlElementFromString('<option value="' + language.threeLetterIsoLanguageName + '">' + language.nativeName + '</option>');

          select.appendChild(optionElement);
        }

        if (languageCount <= 1) {
          self._guestLanguageSelectWrapper.classList.add(self._hiddenClass);
        } else {
          self._guestLanguageSelectWrapper.classList.remove(self._hiddenClass);
        }
      })["catch"](
      /** @param { ErrorResponse } errorResponse **/
      function (errorResponse) {
        console.error(errorResponse);
      });
    }
    /**
     * Clears the customer details language select
     *
     * @private
     */

  }, {
    key: "_clearLanguageSelect",
    value: function _clearLanguageSelect() {
      var select = this._guestLanguageSelectWrapper.querySelector('select[name="language"]');

      if (!select) return;

      while (select.children.length) {
        select.removeChild(select.firstChild);
      }
    }
    /**
     * Loops over an error object that contains field names, and for each field name it will
     * collect the errorResponse from the fields value (that is an array) and pass them to the error
     * list controller which displays them
     *
     * @param {ErrorResponse} errorResponse an object where the properties are the names of the fields that cause the error. Their values must be arrays containing error strings.
     * @private
     */

  }, {
    key: "_handleErrorResponse",
    value: function _handleErrorResponse(errorResponse) {
      if (!this._errorFormController) return;

      for (var field in errorResponse.errors) {
        if (!errorResponse.errors.hasOwnProperty(field)) continue;
        var errors = errorResponse.errors[field].join('<br>');

        this._errorFormController.setFieldError(field, errors);
      }
    }
    /**
     * @private
     * @param {string} from
     * @return {HTMLElement}
     */

  }, {
    key: "_createHtmlElementFromString",
    value: function _createHtmlElementFromString(from) {
      var document = this._domParser.parseFromString(from, 'text/html');

      return document.body.firstChild;
    }
  }]);

  return CheckoutController;
}();



/***/ }),

/***/ "./resources/js/shop/components/checkoutService.js":
/*!*********************************************************!*\
  !*** ./resources/js/shop/components/checkoutService.js ***!
  \*********************************************************/
/*! exports provided: CheckoutService */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CheckoutService", function() { return CheckoutService; });
/* harmony import */ var _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../global/models/errorResponse */ "./resources/js/global/models/errorResponse.js");
/* harmony import */ var _global_models_checkoutInformationResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../global/models/checkoutInformationResponse */ "./resources/js/global/models/checkoutInformationResponse.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }



/**
 * The checkout service knows how to do api calls and handle the responses from the api.
 * All related to the checkout process. It does not do anything with the DOM.
 */

var CheckoutService =
/*#__PURE__*/
function () {
  function CheckoutService() {
    _classCallCheck(this, CheckoutService);

    this._baseRoute = '/';
  }
  /**
   * Sets the shipping address so that the shipping costs for example
   * can be calculated on advance
   *
   * @param {Address} address
   * @return {Promise<boolean>} Resolves when the shipping address is set. Rejects with an ErrorResponse when it is not.
   */


  _createClass(CheckoutService, [{
    key: "setShippingAddress",
    value: function setShippingAddress(address) {
      var self = this;
      return new Promise(function (resolve, reject) {
        Ajax.post(self._baseRoute + 'setShippingAddress', address, function (xhr) {
          // let response = JSON.parse(xhr.response);
          if (_global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].is(xhr.response, false) === false) {
            resolve();
          } else {
            var response = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].fromJsonString(xhr.response);
            reject(response);
          }
        });
      });
    }
    /**
     * Returns most recent information about the checkout process
     */

  }, {
    key: "getCheckoutInformation",
    value: function getCheckoutInformation() {
      var self = this;
      return new Promise(function (resolve, reject) {
        Ajax.get(self._baseRoute + 'getCheckoutInformation', function (xhr) {
          // let response = JSON.parse(xhr.response);
          var isErrorResponse = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].is(xhr.response, false);
          var isCheckoutInformationResponse = _global_models_checkoutInformationResponse__WEBPACK_IMPORTED_MODULE_1__["CheckoutInformationResponse"].is(xhr.response, false);

          if (!isErrorResponse) {
            if (isCheckoutInformationResponse) {
              var checkoutInformationResponse = _global_models_checkoutInformationResponse__WEBPACK_IMPORTED_MODULE_1__["CheckoutInformationResponse"].fromJsonString(xhr.response);
              resolve(checkoutInformationResponse);
            } else {
              console.error('CheckoutService:getCheckoutInformation The response was not a valid CheckoutInformationResponse: ' + xhr.response);
              reject();
            }
          } else {
            var response = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].fromJsonString(xhr.response);
            reject(response);
          }
        });
      });
    }
    /**
     * @param {string} coupon
     * @return {Promise}
     */

  }, {
    key: "addCoupon",
    value: function addCoupon(coupon) {
      var self = this;

      if (typeof coupon !== 'string') {
        console.error('CheckoutService:addCoupon could not add coupon. It must be a string but was not.');
        return Promise.reject('CheckoutService:addCoupon could not add coupon. It must be a string but was not.');
      }

      return new Promise(function (resolve, reject) {
        Ajax.post(self._baseRoute + 'addCouponCode', {
          'coupon': coupon
        }, function (xhr) {
          // let response = JSON.parse(xhr.response);
          var isErrorResponse = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].is(xhr.response, false);
          var isCheckoutInformationResponse = _global_models_checkoutInformationResponse__WEBPACK_IMPORTED_MODULE_1__["CheckoutInformationResponse"].is(xhr.response, false);

          if (!isErrorResponse) {
            if (isCheckoutInformationResponse) {
              var checkoutInformationResponse = _global_models_checkoutInformationResponse__WEBPACK_IMPORTED_MODULE_1__["CheckoutInformationResponse"].fromJsonString(xhr.response);
              resolve(checkoutInformationResponse);
            } else {
              console.error('CheckoutService:addCoupon The response was not a valid CheckoutInformationResponse: ' + xhr.response);
              reject();
            }
          } else {
            var response = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].fromJsonString(xhr.response);
            reject(response);
          }
        });
      });
    }
    /**
     * @param {string} coupon
     * @return {Promise}
     */

  }, {
    key: "removeCoupon",
    value: function removeCoupon(coupon) {
      var self = this;

      if (typeof coupon !== 'string') {
        console.error('CheckoutService:removeCoupon could not remove coupon. It must be a string but was not.', coupon);
        return Promise.reject('CheckoutService:removeCoupon could not remove coupon. It must be a string but was not.');
      }

      return new Promise(function (resolve, reject) {
        Ajax.post(self._baseRoute + 'removeCouponCode', {
          'coupon': coupon
        }, function (xhr) {
          // let response = JSON.parse(xhr.response);
          var isErrorResponse = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].is(xhr.response, false);
          var isCheckoutInformationResponse = _global_models_checkoutInformationResponse__WEBPACK_IMPORTED_MODULE_1__["CheckoutInformationResponse"].is(xhr.response, false);

          if (!isErrorResponse) {
            if (isCheckoutInformationResponse) {
              var checkoutInformationResponse = _global_models_checkoutInformationResponse__WEBPACK_IMPORTED_MODULE_1__["CheckoutInformationResponse"].fromJsonString(xhr.response);
              resolve(checkoutInformationResponse);
            } else {
              console.error('CheckoutService:removeCoupon The response was not a valid CheckoutInformationResponse: ' + xhr.response);
              reject();
            }
          } else {
            var response = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].fromJsonString(xhr.response);
            reject(response);
          }
        });
      });
    }
  }]);

  return CheckoutService;
}();



/***/ }),

/***/ "./resources/js/shop/components/errorController.js":
/*!*********************************************************!*\
  !*** ./resources/js/shop/components/errorController.js ***!
  \*********************************************************/
/*! exports provided: ErrorController */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ErrorController", function() { return ErrorController; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

/**
 * Controls a div with an ul in it to show errors or not
 */
var ErrorController =
/*#__PURE__*/
function () {
  function ErrorController() {
    _classCallCheck(this, ErrorController);

    this._classToHide = 'u-hidden';
    this._errorElementIdSuffix = '_error';
  }
  /**
   * @param {string} fieldSelector
   * @param {string} error
   */


  _createClass(ErrorController, [{
    key: "setFieldError",
    value: function setFieldError(fieldSelector, error) {
      var selector = '#' + fieldSelector + this._errorElementIdSuffix;
      var errorElement = document.querySelector(selector);
      if (!errorElement) return;
      errorElement.classList.remove(this._classToHide);
      errorElement.innerText = error;
    }
    /**
     * @param {string} fieldSelector
     */

  }, {
    key: "clearFieldError",
    value: function clearFieldError(fieldSelector) {
      var selector = '#' + fieldSelector + this._errorElementIdSuffix;
      var errorElement = document.querySelector(selector);
      if (!errorElement) return;
      errorElement.classList.add(this._classToHide);
      errorElement.innerText = '';
    }
    /**
     * Clear all errors
     */

  }, {
    key: "clearAllErrors",
    value: function clearAllErrors() {
      var self = this;
      document.querySelectorAll('[id$=' + this._errorElementIdSuffix + ']').forEach(function (errorElement) {
        errorElement.classList.add(self._classToHide);
        errorElement.innerText = '';
      });
    }
  }]);

  return ErrorController;
}();



/***/ }),

/***/ "./resources/js/shop/components/shoppingcartController.js":
/*!****************************************************************!*\
  !*** ./resources/js/shop/components/shoppingcartController.js ***!
  \****************************************************************/
/*! exports provided: ShoppingcartController */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ShoppingcartController", function() { return ShoppingcartController; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

/**
 * Shopping cart form controller.
 */
var ShoppingcartController =
/*#__PURE__*/
function () {
  /**
   * @param {HTMLDivElement} wrapper
   * @param {ShoppingcartService} shoppingcartService
   */
  function ShoppingcartController(wrapper, shoppingcartService) {
    _classCallCheck(this, ShoppingcartController);

    this._wrapper = wrapper;

    if (!this._wrapper || this._wrapper.tagName !== "DIV") {
      console.error('ShoppingCartController: The shoppingCart form must be a div element but was not or wasn\'t even specified. ShoppingCart controller stopped working');
      return;
    }

    this._addToShoppingcartButtons = wrapper.querySelectorAll('.js-add-product-to-shoppingcart');

    if (this._addToShoppingcartButtons.length === 0) {
      console.error('ShoppingCartController: The shoppingCart form was expected to have 1 or more add shopping cart buttons (class: js-add-product-to-shoppingcart) but got none. ShoppingCart controller stopped working');
      return;
    }

    this._removeFromShoppingcartButtons = wrapper.querySelectorAll('.js-remove-item-from-shoppingcart'); // if(this.removeFromShoppingcartButtons.length === 0) {
    //     console.error('ShoppingCartController: The shoppingCart form was expected to have 1 or more remove shopping cart item buttons (class: js-remove-item-from-shoppingcart) but got none. ShoppingCart controller stopped working');
    //     return;
    // }

    this._changeQuantityShoppingcartItemButtons = wrapper.querySelectorAll('.js-change-quantity-of-shoppingcart-item'); // if(this.changeQuantityShoppingcartItemButtons.length === 0) {
    //     console.error('ShoppingCartController: The shoppingCart form was expected to have 1 or more change quantity buttons (class: js-change-quantity-of-shoppingcart-item) but got none. ShoppingCart controller stopped working');
    //     return;
    // }

    this._shoppingcartService = shoppingcartService;

    if (!shoppingcartService) {
      console.error('ShoppingCartController: The shoppingCartController was expected to get an instance of ShoppingcartService, but did not get one.');
      return;
    }

    this.addProductButtonClicked = this.addProductButtonClicked.bind(this);
    this.removeProductButtonClicked = this.removeProductButtonClicked.bind(this);
    this.changeQuantityButtonClicked = this.changeQuantityButtonClicked.bind(this);
    this.controlListeners(true);
  }
  /**
   * Enable or disable event listeners
   *
   * @param enable
   */


  _createClass(ShoppingcartController, [{
    key: "controlListeners",
    value: function controlListeners() {
      var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
      var addToShoppingcartButtonsLength = this._addToShoppingcartButtons.length;
      var removeFromShoppingcartButtonsLength = this._removeFromShoppingcartButtons.length;
      var changeQuantityShoppingcartItemButtonsLength = this._changeQuantityShoppingcartItemButtons.length;

      for (var index = 0; index < addToShoppingcartButtonsLength; index++) {
        this._addToShoppingcartButtons[index].removeEventListener('click', this.addProductButtonClicked);
      }

      for (var _index = 0; _index < removeFromShoppingcartButtonsLength; _index++) {
        this._removeFromShoppingcartButtons[_index].removeEventListener('click', this.removeProductButtonClicked);
      }

      for (var _index2 = 0; _index2 < changeQuantityShoppingcartItemButtonsLength; _index2++) {
        this._changeQuantityShoppingcartItemButtons[_index2].removeEventListener('click', this.changeQuantityButtonClicked);
      }

      if (enable) {
        for (var _index3 = 0; _index3 < addToShoppingcartButtonsLength; _index3++) {
          this._addToShoppingcartButtons[_index3].addEventListener('click', this.addProductButtonClicked);
        }

        for (var _index4 = 0; _index4 < removeFromShoppingcartButtonsLength; _index4++) {
          this._removeFromShoppingcartButtons[_index4].addEventListener('click', this.removeProductButtonClicked);
        }

        for (var _index5 = 0; _index5 < changeQuantityShoppingcartItemButtonsLength; _index5++) {
          this._changeQuantityShoppingcartItemButtons[_index5].addEventListener('click', this.changeQuantityButtonClicked);
        }
      }
    }
    /**
     * @param {MouseEvent} event
     */

  }, {
    key: "addProductButtonClicked",
    value: function addProductButtonClicked(event) {
      if (!("productId" in event.target.dataset)) {
        console.error('ShoppingCartController: Expected an add button to have the data-product-id attribute set. But did not have that. Not processing click', event.target.dataset);
        return;
      }

      if (!("productType" in event.target.dataset)) {
        console.error('ShoppingCartController: Expected an add button to have the data-type attribute set. But did not have that. Not processing click', event.target.dataset);
        return;
      }

      this._shoppingcartService._addProductToShoppingcart(event.target.dataset.productId, event.target.dataset.productType);
    }
    /**
     * @param {MouseEvent} event
     */

  }, {
    key: "removeProductButtonClicked",
    value: function removeProductButtonClicked(event) {
      if (!("productId" in event.target.dataset)) {
        console.error('ShoppingCartController: Expected an add button to have the data-product-id attribute set. But did not have that. Not processing click', event.target.dataset);
        return;
      }

      if (!("productType" in event.target.dataset)) {
        console.error('ShoppingCartController: Expected an add button to have the data-type attribute set. But did not have that. Not processing click', event.target.dataset);
        return;
      }

      this._shoppingcartService._removeItemFromShoppingcart(event.target.dataset.productId, event.target.dataset.productType);
    }
    /**
     * @param {MouseEvent} event
     */

  }, {
    key: "changeQuantityButtonClicked",
    value: function changeQuantityButtonClicked(event) {
      if (!("shoppingcartItemId" in event.target.dataset)) {
        console.error('ShoppingCartController: Expected an add button to have the data-shoppingcart-item-id attribute set. But did not have that. Not processing click', event.target.dataset);
        return;
      }

      if (!("quantity" in event.target.dataset)) {
        console.error('ShoppingCartController: Expected an add button to have the data-quantity attribute set. But did not have that. Not processing click', event.target.dataset);
        return;
      }

      this._shoppingcartService._setItemQuantityInShoppingcart(event.target.dataset.shoppingcartItemId, event.target.dataset.quantity);
    }
  }, {
    key: "updateCartButtonCounter",
    value: function updateCartButtonCounter() {
      var count = this._wrapper.querySelectorAll('.shoppingcartItemList ul li').length;

      var counter = document.querySelector('.shoppingCartButton span.shoppingCartButtonCounter');
      counter.innerText(count);
    }
  }]);

  return ShoppingcartController;
}();



/***/ }),

/***/ "./resources/js/shop/components/shoppingcartService.js":
/*!*************************************************************!*\
  !*** ./resources/js/shop/components/shoppingcartService.js ***!
  \*************************************************************/
/*! exports provided: ShoppingcartService */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ShoppingcartService", function() { return ShoppingcartService; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var ShoppingcartService =
/*#__PURE__*/
function () {
  function ShoppingcartService() {
    _classCallCheck(this, ShoppingcartService);

    this._baseRoute = '/';
  }
  /**
   * Adds a product to the shopping cart
   *
   * @param id
   * @param type
   */


  _createClass(ShoppingcartService, [{
    key: "_addProductToShoppingcart",
    value: function _addProductToShoppingcart(id, type) {
      var quantity = 10;
      Ajax.post(this._baseRoute + 'addProductToShoppingcart', {
        productableId: id,
        itemType: type,
        quantity: quantity
      }, function (xhr) {
        console.log(xhr);
        window.location = xhr.response;
      });
    }
  }, {
    key: "_removeItemFromShoppingcart",

    /**
     * Remove a product from the shopping cart
     *
     * @param id
     * @param type
     */
    value: function _removeItemFromShoppingcart(id, type) {
      Ajax.post(this._baseRoute + 'removeItemFromShoppingcart', {
        productableId: id,
        itemType: type
      }, function (xhr) {
        window.location = xhr.response;
      });
    }
  }, {
    key: "_setItemQuantityInShoppingcart",

    /**
     * Set the quantity of a shopping cart item
     *
     * @param id
     * @param quantity
     */
    value: function _setItemQuantityInShoppingcart(id, quantity) {
      if (quantity > 0) {
        Ajax.post('/setItemQuantityInShoppingcart', {
          itemId: id,
          quantity: quantity
        }, function (xhr) {
          window.location = xhr.response;
        });
      } else {
        this._removeItemFromShoppingcart(id);
      }
    }
  }]);

  return ShoppingcartService;
}();



/***/ }),

/***/ "./resources/js/shop/components/validationService.js":
/*!***********************************************************!*\
  !*** ./resources/js/shop/components/validationService.js ***!
  \***********************************************************/
/*! exports provided: ValidationService */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ValidationService", function() { return ValidationService; });
/* harmony import */ var _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../global/models/errorResponse */ "./resources/js/global/models/errorResponse.js");
/* harmony import */ var _global_models_validationResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../global/models/validationResponse */ "./resources/js/global/models/validationResponse.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }




var ValidationService =
/*#__PURE__*/
function () {
  function ValidationService() {
    _classCallCheck(this, ValidationService);
  }

  _createClass(ValidationService, [{
    key: "validateCheckoutForm",

    /**
     * @param {FormData} data
     * @return {Promise}
     */
    value: function validateCheckoutForm(data) {
      var self = this;

      if (!(data instanceof FormData)) {
        console.error('ValidationService:validateCheckoutForm could not validate form since no valid FormData instance was given.');
        return Promise.reject('ValidationService:validateCheckoutForm could not validate form since no valid FormData instance was given.');
      }

      return new Promise(function (resolve, reject) {
        Ajax.postFormData('/validation/form/checkout', data, function (xhr) {
          var isErrorResponse = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].is(xhr.response, false);

          if (!isErrorResponse) {
            resolve();
          } else {
            reject(_global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].fromJsonString(xhr.response));
          }
        });
      });
    }
  }]);

  return ValidationService;
}();



/***/ }),

/***/ "./resources/js/site/app.js":
/*!**********************************!*\
  !*** ./resources/js/site/app.js ***!
  \**********************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _components_GlobalisationService__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./components/GlobalisationService */ "./resources/js/site/components/GlobalisationService.js");
/* harmony import */ var _components_RegisterController__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/RegisterController */ "./resources/js/site/components/RegisterController.js");
/* harmony import */ var _shop_components_checkoutController__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../shop/components/checkoutController */ "./resources/js/shop/components/checkoutController.js");
/* harmony import */ var _shop_components_shoppingcartController__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shop/components/shoppingcartController */ "./resources/js/shop/components/shoppingcartController.js");
/* harmony import */ var _shop_components_shoppingcartService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../shop/components/shoppingcartService */ "./resources/js/shop/components/shoppingcartService.js");
/* harmony import */ var _shop_components_checkoutService__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../shop/components/checkoutService */ "./resources/js/shop/components/checkoutService.js");
/* harmony import */ var _shop_components_validationService__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../shop/components/validationService */ "./resources/js/shop/components/validationService.js");
/* harmony import */ var _shop_components_errorController__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../shop/components/errorController */ "./resources/js/shop/components/errorController.js");
/** ==========================================================================
 *  Import ES6 Modules (https://webpack.js.org/api/module-methods/)
 *  =========================================================================*/








/** ==========================================================================
 *  Dependencies
 *  =========================================================================*/

/**
 * External
 */

__webpack_require__(/*! hammerjs */ "./node_modules/hammerjs/hammer.js");

__webpack_require__(/*! objectFitPolyfill */ "./node_modules/objectFitPolyfill/dist/objectFitPolyfill.min.js");
/**
 * Global / Shared with KMS
 */


__webpack_require__(/*! ./../global/polyfills/eventPolyFill */ "./resources/js/global/polyfills/eventPolyFill.js");

__webpack_require__(/*! ./../global/polyfills/isInteger */ "./resources/js/global/polyfills/isInteger.js");

__webpack_require__(/*! ./../global/polyfills/promise */ "./resources/js/global/polyfills/promise.js");
/** ==========================================================================
 *  Global functionalities
 *  =========================================================================*/


__webpack_require__(/*! ./global/helpers */ "./resources/js/site/global/helpers.js"); // Should be first


__webpack_require__(/*! ./global/browserHandler */ "./resources/js/site/global/browserHandler.js"); // require('./global/pagetransitionHandler');
// require('./global/resizeHandler');


__webpack_require__(/*! ./global/scrollHandler */ "./resources/js/site/global/scrollHandler.js");
/** ==========================================================================
 *  Component functionalities
 *  =========================================================================*/


__webpack_require__(/*! ./components/chocolateFactory */ "./resources/js/site/components/chocolateFactory.js");

__webpack_require__(/*! ./components/cookieHandler */ "./resources/js/site/components/cookieHandler.js"); // require('./components/InputHandler');


__webpack_require__(/*! ./components/mapsHandler */ "./resources/js/site/components/mapsHandler.js");

__webpack_require__(/*! ./components/overlayMenuHandler */ "./resources/js/site/components/overlayMenuHandler.js");

__webpack_require__(/*! ./components/projectorHandler */ "./resources/js/site/components/projectorHandler.js");

__webpack_require__(/*! ./components/scrollToHandler */ "./resources/js/site/components/scrollToHandler.js"); // require('./components/searchHandler');
// require('./components/shareButtonsHandler');


__webpack_require__(/*! ./components/youtubeHandler */ "./resources/js/site/components/youtubeHandler.js");
/** ==========================================================================
 *  Shop Component functionalities
 *  =========================================================================*/


var checkoutFormDivElement = document.querySelector('.js-checkout-form');
if (checkoutFormDivElement) new _shop_components_checkoutController__WEBPACK_IMPORTED_MODULE_2__["CheckoutController"](checkoutFormDivElement, new _shop_components_shoppingcartService__WEBPACK_IMPORTED_MODULE_4__["ShoppingcartService"](), new _shop_components_checkoutService__WEBPACK_IMPORTED_MODULE_5__["CheckoutService"](), new _shop_components_validationService__WEBPACK_IMPORTED_MODULE_6__["ValidationService"](), new _components_GlobalisationService__WEBPACK_IMPORTED_MODULE_0__["GlobalisationService"](), new _shop_components_errorController__WEBPACK_IMPORTED_MODULE_7__["ErrorController"]());
var shoppingCartDivElement = document.querySelector('.js-cart');
if (shoppingCartDivElement) new _shop_components_shoppingcartController__WEBPACK_IMPORTED_MODULE_3__["ShoppingcartController"](shoppingCartDivElement, new _shop_components_shoppingcartService__WEBPACK_IMPORTED_MODULE_4__["ShoppingcartService"]());
var registerForm = document.getElementById('registerForm');
if (registerForm) new _components_RegisterController__WEBPACK_IMPORTED_MODULE_1__["RegisterController"](registerForm, new _components_GlobalisationService__WEBPACK_IMPORTED_MODULE_0__["GlobalisationService"]());

/***/ }),

/***/ "./resources/js/site/components/GlobalisationService.js":
/*!**************************************************************!*\
  !*** ./resources/js/site/components/GlobalisationService.js ***!
  \**************************************************************/
/*! exports provided: GlobalisationService */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GlobalisationService", function() { return GlobalisationService; });
/* harmony import */ var _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../global/models/errorResponse */ "./resources/js/global/models/errorResponse.js");
/* harmony import */ var _global_models_countryLanguagesResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../global/models/countryLanguagesResponse */ "./resources/js/global/models/countryLanguagesResponse.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }




var GlobalisationService =
/*#__PURE__*/
function () {
  function GlobalisationService() {
    _classCallCheck(this, GlobalisationService);

    this._baseRoute = '/';
  }
  /**
   * Adds a product to the shopping cart
   *
   * @param {string} countryIso3
   */


  _createClass(GlobalisationService, [{
    key: "getLanguagesForCountryWithIso3",
    value: function getLanguagesForCountryWithIso3(countryIso3) {
      var self = this;
      return new Promise(function (resolve, reject) {
        Ajax.post(self._baseRoute + 'getLanguagesForCountryWithIso3', {
          countryIso3: countryIso3
        }, function (xhr) {
          // let response = JSON.parse(xhr.response);
          var isErrorResponse = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].is(xhr.response, false);
          var isCountryLanguagesResponse = _global_models_countryLanguagesResponse__WEBPACK_IMPORTED_MODULE_1__["CountryLanguagesResponse"].is(xhr.response, false);

          if (!isErrorResponse) {
            if (isCountryLanguagesResponse) {
              var countryLanguagesResponse = _global_models_countryLanguagesResponse__WEBPACK_IMPORTED_MODULE_1__["CountryLanguagesResponse"].fromJsonString(xhr.response);
              resolve(countryLanguagesResponse);
            } else {
              console.error('RegisterService:getLanguagesForCountryWithIso3 The response was not a valid CountryLanguagesResponse: ' + xhr.response);
              reject();
            }
          } else {
            var response = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].fromJsonString(xhr.response);
            reject(response);
          }
        });
      });
    }
  }]);

  return GlobalisationService;
}();



/***/ }),

/***/ "./resources/js/site/components/RegisterController.js":
/*!************************************************************!*\
  !*** ./resources/js/site/components/RegisterController.js ***!
  \************************************************************/
/*! exports provided: RegisterController */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RegisterController", function() { return RegisterController; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var RegisterController =
/*#__PURE__*/
function () {
  /**
   * @param {HTMLDivElement} wrapper
   * @param {GlobalisationService} globalisationService
   */
  function RegisterController(wrapper, globalisationService) {
    _classCallCheck(this, RegisterController);

    this._wrapper = wrapper;

    if (!this._wrapper || this._wrapper.tagName !== "FORM") {
      console.error('RegisterController: The Register form must be a div element but was not or wasn\'t even specified.');
      return;
    }

    this._countrySelect = this._wrapper.querySelector('select[name="country"]');

    if (!this._countrySelect) {
      console.error('RegisterController: The Register form must have a select element with name "country" but did not have it.');
      return;
    }

    this._languageSelect = this._wrapper.querySelector('select[name="language"]');

    if (!this._countrySelect) {
      console.error('RegisterController: The Register form must have a select element with name "language" but did not have it.');
      return;
    }

    this._languageSelectWrapper = this._wrapper.querySelector('.js-language-wrapper');

    if (!this._languageSelectWrapper || this._languageSelectWrapper.tagName !== "DIV") {
      console.error('RegisterController: The Register form must have a wrapper DIV element with class "js-language-wrapper" but did not have it.');
      return;
    }

    this._globalisationService = globalisationService;

    if (!globalisationService) {
      console.error('RegisterController: The Register form was expected to get an instance of RegisterService, but did not get one.');
      return;
    }

    this._hiddenClass = 'u-hidden'; //The name of a class that can be applied to things to hide them.

    this._domParser = new DOMParser();
    this._countryChanged = this._countryChanged.bind(this);
    this.controlListeners(true);

    this._countryChanged();
  }

  _createClass(RegisterController, [{
    key: "controlListeners",
    value: function controlListeners() {
      var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;

      this._countrySelect.removeEventListener('change', this._countryChanged);

      if (enable) {
        this._countrySelect.addEventListener('change', this._countryChanged);
      }
    }
    /**
     * @private
     */

  }, {
    key: "_countryChanged",
    value: function _countryChanged() {
      var countryIso3 = this._countrySelect.value;
      var self = this;

      this._globalisationService.getLanguagesForCountryWithIso3(countryIso3).then(
      /** @param { CountryLanguagesResponse } countryLanguagesResponse **/
      function (countryLanguagesResponse) {
        self._clearLanguageSelect();

        var languageCount = countryLanguagesResponse.languages.length;

        for (var index = 0; index < languageCount; index++) {
          var language = countryLanguagesResponse.languages[index];

          var optionElement = self._createHtmlElementFromString('<option value="' + language.threeLetterIsoLanguageName + '">' + language.nativeName + '</option>');

          self._languageSelect.appendChild(optionElement);
        }

        if (languageCount <= 1) {
          self._languageSelectWrapper.classList.add(self._hiddenClass);
        } else {
          self._languageSelectWrapper.classList.remove(self._hiddenClass);
        }
      })["catch"](
      /** @param { ErrorResponse } errorResponse **/
      function (errorResponse) {
        console.error(errorResponse);
      });
    }
    /**
     * @private
     */

  }, {
    key: "_clearLanguageSelect",
    value: function _clearLanguageSelect() {
      while (this._languageSelect.children.length) {
        this._languageSelect.removeChild(this._languageSelect.firstChild);
      }
    }
    /**
     * @private
     * @param {string} from
     * @return {HTMLElement}
     */

  }, {
    key: "_createHtmlElementFromString",
    value: function _createHtmlElementFromString(from) {
      var document = this._domParser.parseFromString(from, 'text/html');

      return document.body.firstChild;
    }
  }]);

  return RegisterController;
}();



/***/ }),

/***/ "./resources/js/site/components/chocolateFactory.js":
/*!**********************************************************!*\
  !*** ./resources/js/site/components/chocolateFactory.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
 | Prevent Bots handler
 |
 | We named this chocolate factory and belonging confusing js hooks
 | to prevent smart bots from blocking these variable or functions.
 |
 ========================================================================== */
var ChocolateFactory = {
  bannedVisitor: [],

  /** Get all the chocolate factory and start
   *  Looping through those start flashing tickets
   */
  enter: function enter() {
    var chocolateFactories = document.querySelectorAll('.js-chocolate-factory');

    if (isset(chocolateFactories)) {
      var amountOfChocolateFactories = chocolateFactories.length;

      for (var i = 0; i < amountOfChocolateFactories; i++) {
        var ChocolateBar = chocolateFactories[i];

        ChocolateFactory._flashTicket(ChocolateBar);
      }
    }
  },

  /**
   * If factory has a golden ticket
   * Then we can make them go on the tour if there has been click on the ticket
   *
   * @param chocolateBar
   * @private
   */
  _flashTicket: function _flashTicket(chocolateBar) {
    // Try get the ticket from the chocolateBar
    var goldenTicket = chocolateBar.querySelector('.js-golden-ticket'); // Only continue if chocolate bar has a golden ticket

    if (isset(goldenTicket)) {
      goldenTicket.addEventListener('click', function () {
        ChocolateFactory.enjoyTheTour(chocolateBar);
      });
    } else {
      console.log('To bad, no golden tickets has been found.');
    }
  },

  /**
   * Start the tour through the factory
   * And get the names and properties of the members of the group
   * If there are members in the group of course
   *
   * @param chocolateFactory
   */
  enjoyTheTour: function enjoyTheTour(chocolateFactory) {
    // Ask for the tour group
    var tourGroup = chocolateFactory.querySelectorAll('input, textarea');

    if (isset(tourGroup)) {
      // For each visitor we want a belonging Oompa Loompa
      var oompaLoompas = {};
      var amountOfOompaLoompas = 0;
      var tourGroupSize = tourGroup.length;

      for (var i = 0; i < tourGroupSize; i++) {
        // Get the visitor from the group
        var visitor = tourGroup[i]; // Ask for its name

        var visitorName = visitor.getAttribute('name'); // Check if the visitor is banned

        if (ChocolateFactory._isVisitorBanned(visitorName)) continue;
        oompaLoompas[visitorName] = ChocolateFactory._getArrangement(visitor);
        amountOfOompaLoompas++;
      } // Check for insurance that there are oompa loompas


      if (amountOfOompaLoompas === 0) return; // Send submit request

      ChocolateFactory._finishTour(oompaLoompas, chocolateFactory);
    } else {
      console.log('To bad, no members to visit this factory');
    }
  },

  /**
   * Check if the visitor name isn't allow
   *
   * @param visitorName
   * @returns {boolean}
   * @private
   */
  _isVisitorBanned: function _isVisitorBanned(visitorName) {
    if (ChocolateFactory.bannedVisitor.indexOf(visitorName) !== -1) {
      return true;
    }

    return false;
  },

  /**
   * Most get visitor have a normal arrangement
   * But sometimes there are special cases
   * Like a Selector or checkbox
   *
   * @param visitor
   * @returns {*}
   * @private
   */
  _getArrangement: function _getArrangement(visitor) {
    var visitorType = visitor.nodeName;

    switch (visitorType) {
      default:
        return visitor.value;
    }
  },

  /**
   * Finish the tour
   * If successful show thanks message
   * Or show defined error message or fallback
   *
   * @param group
   * @param chocolateFactory
   * @returns {*|void}
   * @private
   */
  _finishTour: function _finishTour(group, chocolateFactory) {
    // Add willie to the group
    group = ChocolateFactory._addWillieWonka(group); // Get the gate for finish the tour

    var gate = '/contact/process';

    try {
      Ajax.post(gate, group, function (HttpRequest) {
        var response = JSON.parse(HttpRequest.response);

        switch (HttpRequest.status) {
          case 200:
            return ChocolateFactory._thanksForVisiting(response.redirectUrl);

          case 422:
            return ChocolateFactory._giveFeedbackToMembers(response.errors, chocolateFactory);

          default:
            break;
        }

        return ChocolateFactory._unknownGapInFactory(chocolateFactory);
      });
    } catch (e) {
      return ChocolateFactory._unknownGapInFactory(chocolateFactory);
    }
  },

  /**
   * Add willie wonka to the group
   * Ps... it actually the secret code!
   *
   * @param group
   * @returns {*}
   * @private
   */
  _addWillieWonka: function _addWillieWonka(group) {
    group._willie = 'wonka';
    return group;
  },

  /**
   * Add the feedback to the desired area.
   * Most likely to the visitor directly, but sometime to the factory desired feedback area
   *
   * @param errors
   * @param chocolateFactory
   * @private
   */
  _giveFeedbackToMembers: function _giveFeedbackToMembers(errors, chocolateFactory) {
    // Grab the factory feedback area
    var feedbackArea = chocolateFactory.querySelector('.js-error-area'); // Clear the current html

    if (isset(feedbackArea)) feedbackArea.innerHTML = ''; // Clear the previous marked jackets

    ChocolateFactory._clearPreviousMarkedJackets(chocolateFactory);

    Object.keys(errors).forEach(function (visitor) {
      var jacket = null;
      var visitorFeedbackArea = null; // Honey elements doesn't has a accessible element

      if (visitor !== '_honey' && visitor !== '_secretCode') {
        // Grab the visitor
        var visitorNode = chocolateFactory.querySelector('#' + visitor); // Find the jacket of a visitor

        jacket = ChocolateFactory._grabVisitorJacket(visitorNode); // If found get the desired area

        if (isset(jacket)) visitorFeedbackArea = jacket.querySelector('.js-form-element-error'); // Clear the current html

        if (isset(visitorFeedbackArea)) visitorFeedbackArea.innerHTML = '';
      } // Get the feedback for this visitor


      var visitorFeedback = errors[visitor]; // Spit out each line

      var visitorFeedbackAmount = visitorFeedback.length;

      for (var i = 0; i < visitorFeedbackAmount; i++) {
        var visitorFeedbackLine = visitorFeedback[i]; // Honey elements doesn't has a accessible element area

        if (visitor !== '_honey' && visitor !== '_secretCode') {
          // Mark the jacket
          if (isset(jacket)) jacket.classList.add('has-error'); // Append feedback to visitor feedback area if defined

          if (isset(visitorFeedbackArea)) {
            var currentFeedbackArea = visitorFeedbackArea.innerHTML;
            currentFeedbackArea += '<span>' + capitalizeFirstLetter(visitorFeedbackLine) + '</span>';
            visitorFeedbackArea.innerHTML = currentFeedbackArea;
          }
        } // Append feedback to factory feedback area if defined


        if (isset(feedbackArea)) {
          var _currentFeedbackArea = feedbackArea.innerHTML;
          _currentFeedbackArea += '<li>' + capitalizeFirstLetter(visitorFeedbackLine) + '</li>';
          feedbackArea.innerHTML = _currentFeedbackArea;
        }
      }
    });
  },

  /**
   * Clear the previous marked jackets
   *
   * @param chocolateFactory
   * @private
   */
  _clearPreviousMarkedJackets: function _clearPreviousMarkedJackets(chocolateFactory) {
    var markedJackets = chocolateFactory.querySelectorAll('.has-error');
    var markedJacketsAmount = markedJackets.length;

    for (var i = 0; i < markedJacketsAmount; i++) {
      markedJackets[i].classList.remove('has-error');
    }
  },

  /**
   * Grab the jacket of the visitor
   *
   * @param visitor
   * @returns {null|*|(() => (Node | null))|ActiveX.IXMLDOMNode|(Node & ParentNode)}
   * @private
   */
  _grabVisitorJacket: function _grabVisitorJacket(visitor) {
    // Check if visitor is defined
    if (!isset(visitor)) return null; // Do loop settings

    currentLayer = visitor;
    safetyBreak = 0; // Grab the next layer till it is the jacket (or safetyBreak has been reached

    do {
      safetyBreak++;
      currentLayer = currentLayer.parentNode;
      if (currentLayer.classList.contains('js-form-element')) return currentLayer;
    } while (currentLayer.tagName !== 'BODY' && safetyBreak <= 10);

    return null;
  },

  /**
   * Redirect the visitor to the thanks page
   *
   * @param nextStop
   * @private
   */
  _thanksForVisiting: function _thanksForVisiting(nextStop) {
    window.location = nextStop;
  },

  /**
   * Unknown error occurred, log the error
   *
   * @param chocolateFactory
   * @private
   */
  _unknownGapInFactory: function _unknownGapInFactory(chocolateFactory) {
    console.log(chocolateFactory);
    console.log('ChocolateFactory: Unkown Error');
  }
};
ChocolateFactory.enter();

/***/ }),

/***/ "./resources/js/site/components/cookieHandler.js":
/*!*******************************************************!*\
  !*** ./resources/js/site/components/cookieHandler.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
   Cookie handler
   - Primary usage for toggling the cookie message and/or switch
 ========================================================================== */
var CookieHandler = {
  cookieBar: null,
  cookieOverlay: null,
  cookieMessage: null,
  cookieSwitch: null,
  cookieFadeOutAnimationDuration: 400,
  acceptTracking: false,
  // Initialize cookie handler
  init: function init() {
    // Bind cookie bar or overlay to cookieMessage
    CookieHandler.cookieMessage = document.querySelector('.js-cookie-bar, .js-cookie-overlay'); // Bind cookie bar to cookieBar

    CookieHandler.cookieBar = document.querySelector('.js-cookie-bar'); // If isset init the functions for cookie bar

    if (isset(CookieHandler.cookieBar)) {
      CookieHandler.initCookieBar();
    } else {
      // Else try to connect cookie overlay with tracking to cookieOverlay
      CookieHandler.cookieOverlay = document.querySelector('.js-cookie-overlay'); // If isset init the functions for cookie overlay

      if (isset(CookieHandler.cookieOverlay)) {
        CookieHandler.initCookieOverlay();
      }
    } // If either type of cookie has been found check if settings are defined


    if (isset(CookieHandler.cookieMessage)) {
      CookieHandler.checkForCookieSettings();
    } // Bind cookie switch to Handler


    CookieHandler.cookieSwitch = document.querySelector('.js-cookie-switch'); // If isset init the functions for cookie switch

    if (isset(CookieHandler.cookieSwitch)) {
      CookieHandler.initCookieSwitch();
    }
  },
  // Init the cookie bar actions
  initCookieBar: function initCookieBar() {
    var closeButton = CookieHandler.cookieBar.querySelector('.js-disable-cookie-bar');

    if (isset(closeButton)) {
      closeButton.addEventListener('click', CookieHandler.closeCookieMessage);
    }
  },
  // Init the cookie overlay actions
  initCookieOverlay: function initCookieOverlay() {
    // Open the cookie settings event
    var openCookieSettingsButton = CookieHandler.cookieMessage.querySelector('.js-change-cookies-settings');

    if (isset(openCookieSettingsButton)) {
      openCookieSettingsButton.addEventListener('click', CookieHandler.openCookieSettings);
    } // Toggle of the tracking input


    var toggleTrackingInput = CookieHandler.cookieMessage.querySelector('.c-cookie-type__input--tracking');

    if (isset(toggleTrackingInput)) {
      if (toggleTrackingInput.checked === true) {
        CookieHandler.acceptTracking = true;
      }

      toggleTrackingInput.addEventListener('change', CookieHandler.toggleTrackingSetting);
    } // Accept / Save cookies button event


    var acceptButton = CookieHandler.cookieMessage.querySelector('.js-accept-cookies');

    if (isset(acceptButton)) {
      acceptButton.addEventListener('click', CookieHandler.setCookieSettings);
    }
  },
  // Init the cookie switch actions
  initCookieSwitch: function initCookieSwitch() {
    // Toggle of the tracking input
    var toggleTrackingInput = CookieHandler.cookieSwitch.querySelector('.c-cookie-type__input--tracking');

    if (isset(toggleTrackingInput)) {
      // Force the state of the cookie switch input because the pop-up is forced on checked
      // while the switch checks by php if the cookie really exist or not
      if (toggleTrackingInput.checked === true) {
        CookieHandler.acceptTracking = true;
      } else {
        CookieHandler.acceptTracking = false;
      }

      toggleTrackingInput.addEventListener('change', CookieHandler.toggleTrackingSetting);
    } // Save cookies button event


    var saveButton = CookieHandler.cookieSwitch.querySelector('.js-save-cookie-settings');

    if (isset(saveButton)) {
      saveButton.addEventListener('click', function () {
        CookieHandler.cookieFadeOutAnimationDuration = 0; // On the switch click we want no delay :)

        CookieHandler.setCookieSettings();
      });
    }
  },
  checkForCookieSettings: function checkForCookieSettings() {
    if (Cookie.get('cookieMessage')) {
      CookieHandler.cookieMessage.classList.add('is-accepted');
    } else {
      CookieHandler.cookieMessage.classList.remove('is-accepted');
      document.body.classList.add('is-cookie-bar-visible');
    }
  },
  closeCookieMessage: function closeCookieMessage() {
    Cookie.set('cookieMessage', true, 90);
    CookieHandler.cookieMessage.classList.add('is-transitioning-out');
    document.body.classList.remove('is-cookie-bar-visible');
  },
  openCookieSettings: function openCookieSettings() {
    CookieHandler.cookieOverlay.querySelector('.js-cookie-settings').classList.remove('is-hidden');
    CookieHandler.cookieOverlay.querySelector('.js-cookie-info').classList.add('is-hidden');
  },
  toggleTrackingSetting: function toggleTrackingSetting() {
    if (CookieHandler.acceptTracking) {
      CookieHandler.acceptTracking = false;
    } else {
      CookieHandler.acceptTracking = true;
    }
  },
  setCookieSettings: function setCookieSettings() {
    // Set tracking cookie or delete it if isset according to the desired settings
    if (CookieHandler.acceptTracking) {
      Cookie.set('trackingCookieAccepted', 'true', 90);
    } else {
      if (Cookie.get('trackingCookieAccepted')) {
        Cookie.erase('trackingCookieAccepted');
      }
    }

    CookieHandler.closeCookieMessage(); // Reload after animation to automatically trigger the tracking after accepting it

    setTimeout(function () {
      location.reload();
    }, CookieHandler.cookieFadeOutAnimationDuration);
  }
};
CookieHandler.init();

/***/ }),

/***/ "./resources/js/site/components/mapsHandler.js":
/*!*****************************************************!*\
  !*** ./resources/js/site/components/mapsHandler.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
    Google Maps handler
    - https://developers.google.com/maps/documentation/javascript/adding-a-google-map
 ========================================================================== */
var MapsHandler = {
  maps: [],
  key: '',
  init: function init() {
    // Get map elements
    var maps = document.querySelectorAll('.js-google-map'); // If there are map elements loop through them and draw the maps

    if (maps.length !== 0) {
      // Convert elements into object for callback when script as been loaded
      for (var i = 0; i < maps.length; i++) {
        // Get map from nodeList
        var map = maps[i];
        if (!map.hasAttribute('data-google-lat') || !map.hasAttribute('data-google-lng')) continue;
        var lat = parseFloat(map.getAttribute('data-google-lat'));
        var lng = parseFloat(map.getAttribute('data-google-lng'));
        MapsHandler.maps.push({
          node: map,
          location: {
            lat: lat,
            lng: lng
          },
          styles: MapsHandler.setCustomStyling()
        });
      } // See if google variable exists


      if (typeof google == 'undefined' || typeof google.maps == 'undefined') {
        // Load external script with drawMaps callback
        getScript('https://maps.googleapis.com/maps/api/js?key=' + MapsHandler.key, MapsHandler.drawMaps);
      } else {
        // If already loaded draw maps
        MapsHandler.drawMaps();
      }
    }
  },

  /**
   * Draw the google maps
   */
  drawMaps: function drawMaps() {
    for (var i = 0; i < MapsHandler.maps.length; i++) {
      var map = MapsHandler.maps[i]; // Create a map

      var googleMap = new google.maps.Map(map.node, {
        zoom: 11,
        center: map.location,
        disableDefaultUI: true,
        styles: map.styles
      }); // Add a marker

      var marker = new google.maps.Marker({
        position: map.location,
        map: googleMap
      });
    }
  },

  /**
   * Set the custom styling for the Google Maps
   *
   * @returns {*[]}
   */
  setCustomStyling: function setCustomStyling() {
    return [{
      "featureType": "poi",
      "elementType": "labels.text.fill",
      "stylers": [{
        "color": "#747474"
      }, {
        "lightness": "23"
      }]
    }, {
      "featureType": "poi.attraction",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#f38eb0"
      }]
    }, {
      "featureType": "poi.government",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#ced7db"
      }]
    }, {
      "featureType": "poi.medical",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#ffa5a8"
      }]
    }, {
      "featureType": "poi.park",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#c7e5c8"
      }]
    }, {
      "featureType": "poi.place_of_worship",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#d6cbc7"
      }]
    }, {
      "featureType": "poi.school",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#c4c9e8"
      }]
    }, {
      "featureType": "poi.sports_complex",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#b1eaf1"
      }]
    }, {
      "featureType": "road",
      "elementType": "geometry",
      "stylers": [{
        "lightness": "100"
      }]
    }, {
      "featureType": "road",
      "elementType": "labels",
      "stylers": [{
        "visibility": "off"
      }, {
        "lightness": "100"
      }]
    }, {
      "featureType": "road.highway",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#ffd4a5"
      }]
    }, {
      "featureType": "road.arterial",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#ffe9d2"
      }]
    }, {
      "featureType": "road.local",
      "elementType": "all",
      "stylers": [{
        "visibility": "simplified"
      }]
    }, {
      "featureType": "road.local",
      "elementType": "geometry.fill",
      "stylers": [{
        "weight": "3.00"
      }]
    }, {
      "featureType": "road.local",
      "elementType": "geometry.stroke",
      "stylers": [{
        "weight": "0.30"
      }]
    }, {
      "featureType": "road.local",
      "elementType": "labels.text",
      "stylers": [{
        "visibility": "on"
      }]
    }, {
      "featureType": "road.local",
      "elementType": "labels.text.fill",
      "stylers": [{
        "color": "#747474"
      }, {
        "lightness": "36"
      }]
    }, {
      "featureType": "road.local",
      "elementType": "labels.text.stroke",
      "stylers": [{
        "color": "#e9e5dc"
      }, {
        "lightness": "30"
      }]
    }, {
      "featureType": "transit.line",
      "elementType": "geometry",
      "stylers": [{
        "visibility": "on"
      }, {
        "lightness": "100"
      }]
    }, {
      "featureType": "water",
      "elementType": "all",
      "stylers": [{
        "color": "#d2e7f7"
      }]
    }];
  }
};
MapsHandler.init();

/***/ }),

/***/ "./resources/js/site/components/overlayMenuHandler.js":
/*!************************************************************!*\
  !*** ./resources/js/site/components/overlayMenuHandler.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* ==========================================================================
   Navigation handler
   - Handles the showing and hiding of the overlay-menu component which has the proper classes.
 ========================================================================== */
var bodyScrollLock = __webpack_require__(/*! body-scroll-lock */ "./node_modules/body-scroll-lock/lib/bodyScrollLock.min.js");

var OverlayMenuHandler = {
  // init: function () {
  //     const overlayMenuTrigger = document.querySelector('.js-overlay-menu-trigger');
  //     OverlayMenuHandler.initOverlayMenu(overlayMenuTrigger);
  // },
  init: function init() {
    var overlayMenuTriggerList = document.querySelectorAll('.js-overlay-menu-trigger');
    var overlayMenuTriggerListCount = overlayMenuTriggerList.length;

    if (isset(overlayMenuTriggerList) && overlayMenuTriggerListCount !== 0) {
      for (var i = 0; i < overlayMenuTriggerListCount; i++) {
        var overlayMenuTrigger = overlayMenuTriggerList[i];
        OverlayMenuHandler.initOverlayMenu(overlayMenuTrigger);
      }
    }
  },
  initOverlayMenu: function initOverlayMenu(overlayMenuTrigger) {
    overlayMenuTrigger.addEventListener('click', OverlayMenuHandler.toggleOverlayMenu, false);
  },
  toggleOverlayMenu: function toggleOverlayMenu(event) {
    var overlayMenuNav = document.querySelector('.js-overlay-menu'); // const overlayMenuBody = overlayMenu.querySelector('.js-overlay-menu-persist-scrolling');
    // Bail if overlayMenu doesn't exist

    if (!overlayMenuNav) return; // Clear previously locked scroll on the body

    bodyScrollLock.enableBodyScroll(overlayMenuNav); // If the overlayMenu is already active, collapse it and quit

    if (document.body.classList.contains('is-overlay-menu-active')) {
      overlayMenuNav.querySelectorAll('[tabindex="0"]').forEach(function (elem) {
        elem.tabIndex = -1;
      });
      document.body.classList.remove('is-overlay-menu-active');
      return;
    } // Lock scrolling on the body


    bodyScrollLock.disableBodyScroll(overlayMenuNav);
    overlayMenuNav.querySelectorAll('[tabindex="-1"]').forEach(function (elem) {
      elem.tabIndex = 0;
    }); // Toggle active overlayMenu by setting a class on the body

    document.body.classList.toggle('is-overlay-menu-active');
    overlayMenuNav.hidden = false;
  }
};
OverlayMenuHandler.init();

/***/ }),

/***/ "./resources/js/site/components/projectorHandler.js":
/*!**********************************************************!*\
  !*** ./resources/js/site/components/projectorHandler.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/**
 * Created by Pascal on 06/12/17.
 * (Name changes by Rob on 18/03/18)
 */

/* Example

const headerImageSliderSetting = new ProjectorSetting({
    sliderProjectorId: 'header-image-slider',
    slideQuery: '#header-image-slider .placeholder figure',
    dots: '#header-image-slider .slider-navigation-labels .navigation span',
    captions: '#header-image-slider .slider-navigation-labels .caption p',
    autoSlide: true,
    sliderInterval: 4000
});
headerImageSliderSetting = headerImageSliderSetting.prepareParameters();

const headerImageSlider = new Projector(headerImageSliderSetting).init();

 */
var projectors = [];
var projectorContainers = document.querySelectorAll('.js-projector');
var projectorContainersLength = projectorContainers.length;

for (var i = 0; i < projectorContainersLength; i++) {
  var projector = projectorContainers[i];
  var projectorId = projector.getAttribute('id');

  if (projectorId !== null) {
    var projectorSetting = new ProjectorSetting({
      sliderId: projectorId,
      slideQuery: '#' + projectorId + ' .js-projector-slide',
      navigationButtons: '#' + projectorId + ' .js-projector-button',
      dots: '#' + projectorId + ' .js-projector-indicator',
      autoSlide: true,
      sliderInterval: 4000
    });
    projectors.push(new Projector(projectorSetting.prepareParameters()).init());
  } else console.log('An image slider has no id...');
}

function ProjectorSetting(settingsObject) {
  var self = this;
  this.sliderId = '';
  this.definedPreviousNext = true;
  this.autoSlide = false;
  this.sliderInterval = 4000;
  this.navigationButtons = '';
  this.dots = '';
  this.captions = '';
  this.slideQuery = '';

  this.setProjectorId = function (string) {
    this.sliderId = string;
    return this;
  };

  this.setDefinedPreviousNext = function (_boolean) {
    this.definedPreviousNext = _boolean;
    return this;
  };

  this.setAutoSlide = function (_boolean2) {
    this.autoSlide = _boolean2;
    return this;
  };

  this.setSliderInterval = function (integer) {
    this.sliderInterval = integer;
    return this;
  };

  this.setSlideQuery = function (string) {
    this.slideQuery = string;
    return this;
  };

  this.setNavigationButtons = function (string) {
    this.navigationButtons = string;
    return this;
  };

  this.setDots = function (string) {
    this.dots = string;
    return this;
  };

  this.setCaptions = function (string) {
    this.captions = string;
    return this;
  };

  this.getProjectorId = function () {
    return this.sliderId;
  };

  this.getDefinedPreviousNext = function () {
    return this.definedPreviousNext;
  };

  this.getAutoSlide = function () {
    return this.autoSlide;
  };

  this.getSliderInterval = function () {
    return this.sliderInterval;
  };

  this.getSlideQuery = function () {
    return this.slideQuery;
  };

  this.getNavigationButtons = function () {
    return this.navigationButtons;
  };

  this.getDots = function () {
    return this.dots;
  };

  this.getCaptions = function () {
    return this.captions;
  }; // Invert setters to getters


  this.prepareParameters = function () {
    return {
      sliderId: self.getProjectorId(),
      definedPreviousNext: self.getDefinedPreviousNext(),
      autoSlide: self.getAutoSlide(),
      sliderInterval: self.getSliderInterval(),
      navigationButtons: self.getNavigationButtons(),
      dots: self.getDots(),
      captions: self.getCaptions(),
      slideQuery: self.getSlideQuery()
    };
  }; // Mass assign settings


  this.fill = function () {
    // Object.keys(settingsObject).forEach(function (key) {
    //     self[key] = settingsObject[key];
    // });
    var settingsObjectKeys = Object.keys(settingsObject);
    var settingsObjectLength = settingsObjectKeys.length;

    for (var _i = 0; _i < settingsObjectLength; _i++) {
      var key = settingsObjectKeys[_i];
      self[key] = settingsObject[key];
    }
  };

  this.fill();
  return {
    sliderId: self.setProjectorId,
    definedPreviousNext: self.setDefinedPreviousNext,
    autoSlide: self.setAutoSlide,
    sliderInterval: self.setSliderInterval,
    navigationButtons: self.setNavigationButtons,
    dots: self.setDots,
    captions: self.setCaptions,
    slideQuery: self.setSlideQuery,
    prepareParameters: self.prepareParameters
  };
}

function Projector(settings) {
  //Define Projector object
  var self = this;
  this.sliderObject = ''; //SlideParameters

  this.activeSlideId = 0;
  this.previousSlideId = 0;
  this.nextSlideId = 0;
  this.availableSlides = 1;
  this.slides = [];
  this.autoSlideInterval = null;
  this.settings = {};

  this.init = function () {
    //Append settings to self
    this.settings = settings; //Assign needed elements and calculations

    this.sliderObject = document.getElementById(this.settings.sliderId);
    this.slides = document.querySelectorAll(this.settings.slideQuery);
    this.availableSlides = this.slides.length;
    this.activeSlideId = 0; //Define previous and next if we want to use those

    if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide(); // Set active slide (and possible previous and next classes)

    this.setSlide(); // Swipe interaction

    var swipeGestures = new Hammer(this.sliderObject);
    swipeGestures.on('swipeleft', function () {
      self.resetAutoSlide();
      self.nextSlide();
      self.setSlide();
    });
    swipeGestures.on('swiperight', function () {
      self.resetAutoSlide();
      self.previousSlide();
      self.setSlide();
    });

    if (this.settings.navigationButtons !== '') {
      // Click interaction
      var navigationButtons = document.querySelectorAll(this.settings.navigationButtons);
      var navigationButtonsLength = navigationButtons.length;

      for (var _i2 = 0; _i2 < navigationButtonsLength; _i2++) {
        var navigationButton = navigationButtons[_i2];
        navigationButton.addEventListener('click', function () {
          self.clickNavigationButton(this);
        });
      }
    }

    if (this.settings.dots !== '') {
      // Click interaction
      var dots = document.querySelectorAll(this.settings.dots);
      var dotsLength = dots.length; // console.log(this.settings.dots);
      // console.log(dots);

      for (var _i3 = 0; _i3 < dotsLength; _i3++) {
        var dot = dots[_i3]; // console.log('hier');

        dot.addEventListener('click', function () {
          self.clickDot(this);
        });
      }
    }

    self.autoSlide();
  };

  this.autoSlide = function () {
    if (this.autoSlideInterval !== null) clearInterval(this.autoSlideInterval);

    if (this.settings.autoSlide && Number.isInteger(this.settings.sliderInterval)) {
      this.autoSlideInterval = setInterval(function () {
        self.nextSlide();
        self.setSlide();
      }, this.settings.sliderInterval);
    }
  };

  this.resetAutoSlide = self.autoSlide;

  this.nextSlide = function () {
    this.activeSlideId++;
    if (this.activeSlideId >= this.availableSlides) this.activeSlideId = 0;
    if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();
  };

  this.previousSlide = function () {
    this.activeSlideId--;
    if (this.activeSlideId < 0) this.activeSlideId = this.availableSlides - 1;
    if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();
  };

  this.setPreviousAndNextSlide = function () {
    this.nextSlideId = this.activeSlideId + 1;
    if (this.nextSlideId >= this.availableSlides) this.nextSlideId = 0;
    this.previousSlideId = this.activeSlideId - 1;
    if (this.previousSlideId < 0) this.previousSlideId = this.availableSlides - 1;
  };

  this.setSlide = function () {
    // Loop through the form elements
    var slidesLength = self.slides.length;

    for (var _i4 = 0; _i4 < slidesLength; _i4++) {
      var slide = self.slides[_i4]; // Convert data set attribute to desired type

      var slideOrder = parseInt(slide.getAttribute('data-order')); // Remove and set active for all slides

      if (slideOrder !== self.activeSlideId) slide.classList.remove('is-active');else slide.classList.add('is-active'); // If we use the previous and next, also set those classes

      if (self.settings.definedPreviousNext) {
        if (slideOrder !== self.previousSlideId) slide.classList.remove('previous');else slide.classList.add('previous');
        if (slideOrder !== self.nextSlideId) slide.classList.remove('next');else slide.classList.add('next');
      }
    }

    if (self.settings.dots !== '') {
      self.setActiveDot();
    }

    if (self.settings.captions !== '') {
      self.setActiveCaption();
    }
  };

  this.clickNavigationButton = function (navButton) {
    self.activeSlideId = parseInt(navButton.getAttribute('data-order'));
    if (self.settings.definedPreviousNext) self.setPreviousAndNextSlide();
    self.setSlide();
    var next = document.querySelector(self.settings.navigationButtons + '.next');
    var previous = document.querySelector(self.settings.navigationButtons + '.previous');
    next.setAttribute('data-order', self.nextSlideId);
    previous.setAttribute('data-order', self.previousSlideId);
    self.resetAutoSlide(); // next.querySelector('p').innerHTML = self.slides[self.nextSlideId].dataset.name;
    // previous.querySelector('p').innerHTML = self.slides[self.previousSlideId].dataset.name;
  };

  this.clickDot = function (clickedDot) {
    self.activeSlideId = parseInt(clickedDot.getAttribute('data-order'));
    self.setSlide();
    self.resetAutoSlide();
  };

  this.setActiveDot = function () {
    var dots = document.querySelectorAll(this.settings.dots);
    var dotsLength = dots.length;

    for (var _i5 = 0; _i5 < dotsLength; _i5++) {
      var dot = dots[_i5];
      dotOrder = parseInt(dot.getAttribute('data-order'));
      if (dotOrder !== self.activeSlideId) dot.classList.remove('is-active');else dot.classList.add('is-active');
    }
  };

  this.setActiveCaption = function () {
    var captions = document.querySelectorAll(this.settings.captions);
    var captionsLength = captions.length;

    for (var _i6 = 0; _i6 < captionsLength; _i6++) {
      var caption = captions[_i6];
      captionOrder = parseInt(caption.getAttribute('data-order'));
      if (captionOrder !== self.activeSlideId) caption.classList.remove('is-active');else caption.classList.add('is-active');
    }
  };
}

/***/ }),

/***/ "./resources/js/site/components/scrollToHandler.js":
/*!*********************************************************!*\
  !*** ./resources/js/site/components/scrollToHandler.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
    Scroll To Click handler
 ========================================================================== */
var ScrollToHandler = {
  // Animation settings
  offset: 60,
  //pixel
  duration: 1400,
  //ms
  // Animation variables
  body: null,
  start: 0,
  change: 0,
  currentTime: 0,
  allowAnimation: false,
  scrollToAnimation: null,
  // Watch the EasingFunction helper for the available methods
  easing: 'easeInOutQuad',
  init: function init() {
    var anchorLinks = document.querySelectorAll('.js-scroll-to-target');
    var anchorLinksAmount = anchorLinks.length;

    for (var i = 0; i < anchorLinksAmount; i++) {
      var anchorLink = anchorLinks[i];
      anchorLink.addEventListener('click', function (event) {
        ScrollToHandler.prepareScrollTo(this.getAttribute('href'));
        event.preventDefault();
      });
    }
  },

  /**
   * Prepare the Handler for the animation
   */
  prepareScrollTo: function prepareScrollTo(elementId) {
    // Get the scroll to element
    elementId = elementId.substr(elementId.indexOf('#') + 1);
    var scrollToElement = document.getElementById(elementId);
    var scrollToElementPosition = scrollToElement.getBoundingClientRect(); // Reset or define the Handler variables

    ScrollToHandler.body = document.documentElement;
    ScrollToHandler.start = Math.max(ScrollToHandler.body.scrollTop, document.body.scrollTop, window.pageYOffset); //Use Math.max because safari doesn't support document.documentElement.scrollTop

    ScrollToHandler.change = scrollToElementPosition.top + ScrollToHandler.start - ScrollToHandler.start - ScrollToHandler.offset;
    ScrollToHandler.startTime = 'now' in window.performance ? performance.now() : new Date().getTime();
    ScrollToHandler.allowAnimation = true; // Trigger animation

    scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll); // Stop on scroll

    window.addEventListener('mousedown', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('wheel', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('DOMMouseScroll', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('mousewheel', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('keyup', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('touchmove', ScrollToHandler.abortScrollAnimation);
  },

  /*
   * Animate the scroll position
   */
  animateScroll: function animateScroll(timestamp) {
    // Calculate progress from 0 - 1
    var progress = Math.min(1, (timestamp - ScrollToHandler.startTime) / ScrollToHandler.duration);
    if (progress < 0) progress = 0; // Convert progress with easing function

    progress = EasingFunctions[ScrollToHandler.easing](progress);
    var newScrollTop = ScrollToHandler.start + ScrollToHandler.change * progress;
    ScrollToHandler.body.scrollTop = newScrollTop;
    if (ScrollToHandler.body.scrollTop === 0) document.body.scrollTop = newScrollTop; // Safari doesn't support so if ScrollToHandler.body.scrollTop is 0 force the scroll position through document.body.scrollTop

    if (progress < 1 && ScrollToHandler.allowAnimation) {
      scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll);
    }
  },

  /*
   * Abort the scroll animation
   */
  abortScrollAnimation: function abortScrollAnimation(event) {
    ScrollToHandler.allowAnimation = false;
    cancelAnimationFrame(ScrollToHandler.scrollToAnimation);
  }
};
ScrollToHandler.init();

/***/ }),

/***/ "./resources/js/site/components/youtubeHandler.js":
/*!********************************************************!*\
  !*** ./resources/js/site/components/youtubeHandler.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
    Youtube handler
 ========================================================================== */
var YoutubeHandler = {
  youtubeClass: '.js-youtube-player',
  players: [],
  init: function init() {
    // Get the youtube players containers
    var youtubePlayers = document.querySelectorAll(YoutubeHandler.youtubeClass);
    var youtubePlayersAmount = youtubePlayers.length;

    for (var i = 0; i < youtubePlayersAmount; i++) {
      var youtubePlayer = youtubePlayers[i];
      var youtubePlayerId = youtubePlayer.getAttribute('id');

      if (youtubePlayerId !== null) {
        // Strip the necessary data from the html and create objects from it
        var youtubeElement = {
          id: youtubePlayer.getAttribute('id'),
          link: youtubePlayer.getAttribute('data-youtube-link'),
          autoPlay: parseInt(youtubePlayer.getAttribute('data-auto-play'))
        };
        YoutubeHandler.players.push(youtubeElement);
      } else {
        console.log("Element not include because there isn't a id on the player");
        console.log(youtubePlayer);
      }
    }

    if (youtubePlayersAmount >= 1) YoutubeHandler.initYoutube();
  },

  /**
   * Check if external script is loaded
   *
   */
  initYoutube: function initYoutube() {
    // See if YT variable exists
    if (typeof YT == 'undefined' || typeof YT.Player == 'undefined') {
      // Setup API ready function
      window.onYouTubePlayerAPIReady = function () {
        YoutubeHandler.loadPlayers();
      }; // Load external script


      getScript('https://www.youtube.com/iframe_api'); // If YT already exists load player
    } else {
      YoutubeHandler.loadPlayers();
    }
  },

  /**
   * Create the Youtube player(s) with parameters
   * And rewrite the players to key them by the element id
   *
   */
  loadPlayers: function loadPlayers() {
    var players = [];
    var youtubePlayersAmount = YoutubeHandler.players.length;

    for (var i = 0; i < youtubePlayersAmount; i++) {
      var youtubePlayer = YoutubeHandler.players[i]; // Load player

      youtubePlayer.player = new YT.Player(youtubePlayer.id, {
        height: 200,
        width: 200,
        videoId: youtubePlayer.link,
        host: 'https://www.youtube-nocookie.com',
        playerVars: {
          modestbranding: 0,
          rel: 0,
          disablekb: 1,
          autoplay: youtubePlayer.autoPlay
        },
        events: {
          // 'onReady': YoutubeHandler.onReady,
          'onStateChange': YoutubeHandler.onStateChange
        }
      });
      players[youtubePlayer.id] = youtubePlayer;
    }

    YoutubeHandler.players = players;
  },

  /**
   * When player is ready to play
   */
  onReady: function onReady(event) {
    var playerContainerId = event.target.getIframe().getAttribute('id');
    var player = YoutubeHandler.players[playerContainerId].player; // Show video
    // setTimeout(function(){ $('#' + playerContainerId).stop().animate({ opacity: 1 },1000) },800);
    // If not on tablet or mobile, play on high quality
    // player.mute();
    // player.playVideo();
    // player.setPlaybackQuality('hd1080');
  },

  /**
   * Listener for Youtube state change
   */
  onStateChange: function onStateChange(event) {
    var playerContainerId = event.target.getIframe().getAttribute('id');
    var player = YoutubeHandler.players[playerContainerId].player;
    var videoState = event.data; // Loop video

    if (event.data === YT.PlayerState.ENDED) {
      player.playVideo();
    }
  }
};
YoutubeHandler.init();

/***/ }),

/***/ "./resources/js/site/global/browserHandler.js":
/*!****************************************************!*\
  !*** ./resources/js/site/global/browserHandler.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
   Browser Handler
 ========================================================================== */
var BrowserHandler = {
  userAgent: '',
  browserInfo: '',
  init: function init() {
    BrowserHandler.userAgent = window.navigator.userAgent;
    BrowserHandler.browserInfo = BrowserHandler.getBrowserInfo();
    BrowserHandler.handleIE();
    BrowserHandler.handleSafari();
  },
  handleIE: function handleIE() {
    // Detect versions below ie11
    var msie = BrowserHandler.userAgent.indexOf('MSIE ');
    var ielt11 = msie > 0; // Detect ie11

    var ie11 = !!navigator.userAgent.match(/Trident.*rv\:11\./); // If Internet Explorer

    if (ielt11 || ie11) {
      // Default version
      var version = '11'; // Way to detect version < 11

      if (ielt11) version = parseInt(BrowserHandler.userAgent.substring(msie + 5, BrowserHandler.userAgent.indexOf(".", msie))); // Append classes to HTML (we have to do this separately because else ie will fail)

      document.body.classList.add('ie');
      document.body.classList.add('v' + version);
    }
  },
  // Fallback for older safari version
  handleSafari: function handleSafari() {
    if (BrowserHandler.browserInfo.name === 'Safari' && BrowserHandler.browserInfo.version <= 10) {
      document.getElementsByTagName('html')[0].classList.add('ie');
    }
  },
  getBrowserInfo: function getBrowserInfo() {
    var ua = navigator.userAgent,
        tem,
        M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];

    if (/trident/i.test(M[1])) {
      tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
      return {
        name: 'IE ',
        version: tem[1] || ''
      };
    }

    if (M[1] === 'Chrome') {
      tem = ua.match(/\bOPR\/(\d+)/);

      if (tem != null) {
        return {
          name: 'Opera',
          version: tem[1]
        };
      }
    }

    M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];

    if ((tem = ua.match(/version\/(\d+)/i)) != null) {
      M.splice(1, 1, tem[1]);
    }

    return {
      name: M[0],
      version: M[1]
    };
  }
};
BrowserHandler.init();

/***/ }),

/***/ "./resources/js/site/global/helpers.js":
/*!*********************************************!*\
  !*** ./resources/js/site/global/helpers.js ***!
  \*********************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
    Helper functions
 ========================================================================== */

/*
 * Simple isset method for this does not exist in javascript
 */
window.isset = function (obj) {
  return typeof obj !== 'undefined' && obj !== null;
};
/*
 * Easing Functions - inspired from http://gizma.com/easing/
 * only considering the t value for the range [0, 1] => [0, 1]
 */


window.EasingFunctions = {
  // no easing, no acceleration
  linear: function linear(t) {
    return t;
  },
  // accelerating from zero velocity
  easeInQuad: function easeInQuad(t) {
    return t * t;
  },
  // decelerating to zero velocity
  easeOutQuad: function easeOutQuad(t) {
    return t * (2 - t);
  },
  // acceleration until halfway, then deceleration
  easeInOutQuad: function easeInOutQuad(t) {
    return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
  },
  // accelerating from zero velocity
  easeInCubic: function easeInCubic(t) {
    return t * t * t;
  },
  // decelerating to zero velocity
  easeOutCubic: function easeOutCubic(t) {
    return --t * t * t + 1;
  },
  // acceleration until halfway, then deceleration
  easeInOutCubic: function easeInOutCubic(t) {
    return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;
  },
  // accelerating from zero velocity
  easeInQuart: function easeInQuart(t) {
    return t * t * t * t;
  },
  // decelerating to zero velocity
  easeOutQuart: function easeOutQuart(t) {
    return 1 - --t * t * t * t;
  },
  // acceleration until halfway, then deceleration
  easeInOutQuart: function easeInOutQuart(t) {
    return t < .5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;
  },
  // accelerating from zero velocity
  easeInQuint: function easeInQuint(t) {
    return t * t * t * t * t;
  },
  // decelerating to zero velocity
  easeOutQuint: function easeOutQuint(t) {
    return 1 + --t * t * t * t * t;
  },
  // acceleration until halfway, then deceleration
  easeInOutQuint: function easeInOutQuint(t) {
    return t < .5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t;
  }
};
/*
 * Vanilla version of the $.getScript
 */

window.getScript = function (source, callback) {
  var script = document.createElement('script');
  script.async = 1;
  var scripts = document.getElementsByTagName('script');
  var prior = scripts[scripts.length - 1];

  script.onload = script.onreadystatechange = function (_, isAbort) {
    if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {
      script.onload = script.onreadystatechange = null;
      script = undefined;

      if (!isAbort) {
        if (callback) callback();
      }
    }
  };

  script.src = source;
  prior.parentNode.insertBefore(script, prior);
};
/**
 * Returns a function, that, as long as it continues to be invoked, will not
 * be triggered. The function will be called after it stops being called for
 * N milliseconds. If `immediate` is passed, trigger the function on the
 * leading edge, instead of the trailing.
 * @param func
 * @param wait
 * @param immediate
 * @returns {Function}
 */


window.debounce = function (func, wait, immediate) {
  var timeout;
  return function () {
    var context = this,
        args = arguments;

    var later = function later() {
      timeout = null;
      if (!immediate) func.apply(context, args);
    };

    var callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
    if (callNow) func.apply(context, args);
  };
};
/*
 * Cookie helper class
 */


window.Cookie = {
  set: function set(name, value, days) {
    var domain, domainParts, date, expires, host;

    if (days) {
      date = new Date();
      date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
      expires = "; expires=" + date.toGMTString();
    } else {
      expires = "";
    }

    host = location.host;

    if (host.split('.').length === 1) {
      // no "." in a domain - it's localhost or something similar
      document.cookie = name + "=" + value + expires + "; path=/";
    } else {
      // Remember the cookie on all sub domains.
      //
      // Start with trying to set cookie to the top domain.
      // (example: if user is on foo.com, try to set
      //  cookie to domain ".com")
      //
      // If the cookie will not be set, it means ".com"
      // is a top level domain and we need to
      // set the cookie to ".foo.com"
      domainParts = host.split('.');
      domainParts.shift();
      domain = '.' + domainParts.join('.'); // For development purpose, remove this when moving to production
      // domain = '.komma.pro';

      document.cookie = name + "=" + value + expires + "; path=/; domain=" + domain; // check if cookie was successfuly set to the given domain
      // (otherwise it was a Top-Level Domain)

      if (Cookie.get(name) == null || Cookie.get(name) != value) {
        // append "." to current domain
        domain = '.' + host;
        document.cookie = name + "=" + value + expires + "; path=/; domain=" + domain;
      }
    }
  },
  get: function get(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');

    for (var i = 0; i < ca.length; i++) {
      var c = ca[i];

      while (c.charAt(0) === ' ') {
        c = c.substring(1, c.length);
      }

      if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
    }

    return null;
  },
  erase: function erase(name) {
    Cookie.set(name, '', -1);
  }
};
/*
 * Javascript version of the number_format method of PHP
 */

window.number_format = function (number, decimals, dec_point, thousands_sep) {
  // Strip all characters but numerical ones.
  number = (number + '').replace(/[^0-9+\-Ee.]/g, '');

  var n = !isFinite(+number) ? 0 : +number,
      prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
      sep = typeof thousands_sep === 'undefined' ? ',' : thousands_sep,
      dec = typeof dec_point === 'undefined' ? '.' : dec_point,
      s = '',
      toFixedFix = function toFixedFix(n, prec) {
    var k = Math.pow(10, prec);
    return '' + Math.round(n * k) / k;
  }; // Fix for IE parseFloat(0.55).toFixed(0) = 0;


  s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');

  if (s[0].length > 3) {
    s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
  }

  if ((s[1] || '').length < prec) {
    s[1] = s[1] || '';
    s[1] += new Array(prec - s[1].length + 1).join('0');
  }

  return s.join(dec);
};
/**
 * Element.closest() polyfill
 * https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill
 */


if (!Element.prototype.closest) {
  if (!Element.prototype.matches) {
    Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
  }

  Element.prototype.closest = function (s) {
    var el = this;
    var ancestor = this;
    if (!document.documentElement.contains(el)) return null;

    do {
      if (ancestor.matches(s)) return ancestor;
      ancestor = ancestor.parentElement;
    } while (ancestor !== null);

    return null;
  };
}

window.Ajax = {
  //TODO: Can we create a prepare request function ??
  get: function get(url, callback) {
    var xhr = new XMLHttpRequest();
    var token = document.querySelector('meta[name="csrf-token"]').content;
    xhr.open('get', url, true);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.setRequestHeader('X-CSRF-TOKEN', token);
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

    xhr.onreadystatechange = function () {
      if (xhr.readyState === 4) {
        callback(xhr);
      }
    };

    xhr.send();
  },
  post: function post(url, data, callback) {
    var xhr = new XMLHttpRequest();
    var token = document.querySelector('meta[name="csrf-token"]').content;
    xhr.open('post', url, true);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.setRequestHeader('X-CSRF-TOKEN', token);
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

    xhr.onreadystatechange = function () {
      if (xhr.readyState === 4) {
        callback(xhr);
      }
    };

    xhr.send(JSON.stringify(data));
  },
  postFormData: function postFormData(url, data, callback) {
    var xhr = new XMLHttpRequest();
    var token = document.querySelector('meta[name="csrf-token"]').content;
    xhr.open('post', url, true);
    xhr.setRequestHeader('X-CSRF-TOKEN', token);
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

    xhr.onreadystatechange = function () {
      if (xhr.readyState === 4) {
        callback(xhr);
      }
    };

    xhr.send(data);
  }
};
/**
 * Capitalize the first letter of the string
 * @param string
 * @returns {string}
 */

window.capitalizeFirstLetter = function (string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
};
/**
 * Convert snake case into camelcase
 *
 * @param string
 * @returns {*}
 */


window.snakeToCamel = function (string) {
  return string.replace(/(\-\w)/g, function (m) {
    return m[1].toUpperCase();
  });
};
/**
 * Get the index of an element inside its parent
 */


window.indexInParent = function (node) {
  var children = node.parentNode.childNodes;
  var num = 0;

  for (var i = 0; i < children.length; i++) {
    if (children[i] == node) return num;
    if (children[i].nodeType == 1) num++;
  }

  return -1;
};
/**
 * For security reasons iOS Safari only allows document.execCommand('copy') for text within a contentEditable container.
 * The workaround is to detect iOS Safari and quickly toggle contentEditable before executing document.execCommand('copy').
 * Wheb input or textarea is READONLY you can prevent the unwanted popup with copy/paste functions and the input keyboard
 * Code from: https://stackoverflow.com/a/46981847
 */


window.copyToClipboard = function (el) {
  // resolve the element
  el = typeof el === 'string' ? document.querySelector(el) : el; // handle iOS as a special case

  if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {
    // save current contentEditable/readOnly status
    var editable = el.contentEditable;
    var readOnly = el.readOnly; // convert to editable with readonly to stop iOS keyboard opening

    el.contentEditable = true;
    el.readOnly = true; // create a selectable range

    var range = document.createRange();
    range.selectNodeContents(el); // select the range

    var selection = window.getSelection();
    selection.removeAllRanges();
    selection.addRange(range);
    el.setSelectionRange(0, 999999); // restore contentEditable/readOnly to original state

    el.contentEditable = editable;
    el.readOnly = readOnly;
  } else {
    el.select();
  } // execute copy command


  document.execCommand('copy');
};
/**
 * Get the position of the element related to the body
 *
 * @param el
 * @returns {{top: number, left: number}}
 */


window.bodyOffset = function (el) {
  var rect = el.getBoundingClientRect(),
      scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,
      scrollTop = window.pageYOffset || document.documentElement.scrollTop;
  return {
    top: rect.top + scrollTop,
    left: rect.left + scrollLeft
  };
};

/***/ }),

/***/ "./resources/js/site/global/scrollHandler.js":
/*!***************************************************!*\
  !*** ./resources/js/site/global/scrollHandler.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
   Scroll handler
   - Handler the objects which are bind on scroll events or visible in viewport
 ========================================================================== */
var ScrollHandler = {
  // Variables for debounce and throttle effects
  time: Date.now(),
  timeout: null,
  waitThrottle: 1000,
  waitDebounce: 300,
  // Variables for scroll direction
  lastScrollTopPosition: 0,
  scrollDirectionDown: true,
  scrollDirectionUp: false,
  //Initialisation
  init: function init() {
    // Trigger start on start up
    ScrollHandler.triggerOnInit(); // Throttle scroll

    window.addEventListener('scroll', function () {
      if (ScrollHandler.time + ScrollHandler.waitThrottle - Date.now() < 0) {
        ScrollHandler.triggerThrottle();
        ScrollHandler.time = Date.now();
      }
    }); // Smooth scroll

    window.addEventListener('scroll', function () {
      ScrollHandler.triggerSmooth();
    }); // Debounce scroll

    window.addEventListener('scroll', function () {
      if (isset(ScrollHandler.timeout)) clearTimeout(ScrollHandler.timeout);
      ScrollHandler.timeout = setTimeout(ScrollHandler.triggerDebounce, ScrollHandler.waitDebounce);
    });
  },
  // Trigger on start up
  triggerOnInit: function triggerOnInit() {
    ScrollHandler.triggerElementInViewportAnimation();
  },
  // Trigger scroll functions with throttle (preferred)
  triggerThrottle: function triggerThrottle() {
    // console.log('Throttled scroll');
    ScrollHandler.triggerElementInViewportAnimation();
  },
  // Trigger scroll on debounce
  triggerDebounce: function triggerDebounce() {// console.log('Debounce scroll');
  },
  // Trigger scroll on the flight
  triggerSmooth: function triggerSmooth() {
    // console.log('Smooth scroll');
    ScrollHandler.detectScrollDirection();
    ScrollHandler.toggleStickyHeader();
  },
  // Detect if part of a given element is visible in the viewport
  // El must be a node element
  detectIfElementIsPartlyInViewport: function detectIfElementIsPartlyInViewport(el) {
    if (isset(el)) {
      var rect = el.getBoundingClientRect(); // DOMRect { x: 8, y: 8, width: 100, height: 100, top: 8, right: 108, bottom: 108, left: 8 }

      var windowHeight = window.innerHeight || document.documentElement.clientHeight;
      var windowWidth = window.innerWidth || document.documentElement.clientWidth;
      var verticalInView = rect.top <= windowHeight && rect.top + rect.height >= 0;
      var horizontalInView = rect.left <= windowWidth && rect.left + rect.width >= 0;
      return verticalInView && horizontalInView;
    }
  },
  // Detect if a given element is fully visible in the viewport
  // El must be a node element
  detectIfElementIsFullyInViewport: function detectIfElementIsFullyInViewport(el) {
    if (isset(el)) {
      var rect = el.getBoundingClientRect();
      return rect.top >= 0 && rect.bottom <= window.innerHeight;
    }
  },
  detectScrollDirection: function detectScrollDirection() {
    var scrollTopPosition = window.pageYOffset || document.documentElement.scrollTop; // Credits: "https://github.com/qeremy/so/blob/master/so.dom.js#L426"

    if (scrollTopPosition >= ScrollHandler.lastScrollTopPosition) {
      ScrollHandler.scrollDirectionDown = true;
      ScrollHandler.scrollDirectionUp = false;
    } else {
      ScrollHandler.scrollDirectionDown = false;
      ScrollHandler.scrollDirectionUp = true;
    }

    ScrollHandler.lastScrollTopPosition = scrollTopPosition;
  },
  // Trigger animation on elements that have 'element-in-viewport' and that are in the viewport
  // These animation can only be triggered once, if you want more then that you should write an specific function for this
  triggerElementInViewportAnimation: function triggerElementInViewportAnimation() {
    var elements = document.querySelectorAll('.element-in-viewport');
    var elementsLength = elements.length;

    for (var e = 0; e < elementsLength; e++) {
      var element = elements[e];

      if (ScrollHandler.detectIfElementIsPartlyInViewport(element)) {
        element.classList.remove('element-in-viewport');
      }
    }
  },
  // ------------------------------ CUSTOM SCROLL HANDLERS ------------------------------------
  // Hide or show sticky navigation when header isn't visible
  toggleStickyHeader: function toggleStickyHeader() {
    var stickyHeader = document.querySelector('.js-sticky-header');
    var visibleStickyHeaderClass = 'is-sticky-header-visible';
    var subnavList = document.querySelectorAll('.js-subnav');
    var subNavIsVisible = false;
    stickyHeader.hidden = false;

    for (var i = 0; i < subnavList.length; i++) {
      if (window.getComputedStyle(subnavList[i], null).visibility == "visible") {
        return subNavIsVisible = true;
      }
    }

    if (isset(stickyHeader) && !subNavIsVisible) {
      // Hide when scrolling DOWN (OR within offset)
      if (ScrollHandler.scrollDirectionDown || ScrollHandler.lastScrollTopPosition < 110) {
        document.body.classList.remove(visibleStickyHeaderClass);
      } // Show when scrolling UP and outside of offset
      else {
          document.body.classList.add(visibleStickyHeaderClass);
        }
    }
  }
};
ScrollHandler.init();

/***/ }),

/***/ "./resources/sass/kms/styles.sass":
/*!****************************************!*\
  !*** ./resources/sass/kms/styles.sass ***!
  \****************************************/
/*! no static exports found */
/***/ (function(module, exports) {

// removed by extract-text-webpack-plugin

/***/ }),

/***/ "./resources/sass/site/style.scss":
/*!****************************************!*\
  !*** ./resources/sass/site/style.scss ***!
  \****************************************/
/*! no static exports found */
/***/ (function(module, exports) {

// removed by extract-text-webpack-plugin

/***/ }),

/***/ 0:
/*!**********************************************************************************************************!*\
  !*** multi ./resources/js/site/app.js ./resources/sass/site/style.scss ./resources/sass/kms/styles.sass ***!
  \**********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

__webpack_require__(/*! /Users/julesgraus/webDevelopment/KMS/resources/js/site/app.js */"./resources/js/site/app.js");
__webpack_require__(/*! /Users/julesgraus/webDevelopment/KMS/resources/sass/site/style.scss */"./resources/sass/site/style.scss");
module.exports = __webpack_require__(/*! /Users/julesgraus/webDevelopment/KMS/resources/sass/kms/styles.sass */"./resources/sass/kms/styles.sass");


/***/ })

},[[0,"/js/site/manifest","/js/site/vendor"]]]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZXRpbW1lZGlhdGUvc2V0SW1tZWRpYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2dsb2JhbC9tb2RlbHMvYWRkcmVzcy5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZ2xvYmFsL21vZGVscy9jaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2dsb2JhbC9tb2RlbHMvY291bnRyeUxhbmd1YWdlc1Jlc3BvbnNlLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9nbG9iYWwvbW9kZWxzL2Vycm9yUmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2dsb2JhbC9tb2RlbHMvbGFuZ3VhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2dsb2JhbC9tb2RlbHMvdmFsaWRhdGlvblJlc3BvbnNlLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9nbG9iYWwvcG9seWZpbGxzL2V2ZW50UG9seUZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2dsb2JhbC9wb2x5ZmlsbHMvaXNJbnRlZ2VyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9nbG9iYWwvcG9seWZpbGxzL3Byb21pc2UuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3Nob3AvY29tcG9uZW50cy9jaGVja291dENvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3Nob3AvY29tcG9uZW50cy9jaGVja291dFNlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3Nob3AvY29tcG9uZW50cy9lcnJvckNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3Nob3AvY29tcG9uZW50cy9zaG9wcGluZ2NhcnRDb250cm9sbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9zaG9wL2NvbXBvbmVudHMvc2hvcHBpbmdjYXJ0U2VydmljZS5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2hvcC9jb21wb25lbnRzL3ZhbGlkYXRpb25TZXJ2aWNlLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9zaXRlL2FwcC5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL0dsb2JhbGlzYXRpb25TZXJ2aWNlLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9zaXRlL2NvbXBvbmVudHMvUmVnaXN0ZXJDb250cm9sbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9zaXRlL2NvbXBvbmVudHMvY2hvY29sYXRlRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL2Nvb2tpZUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NpdGUvY29tcG9uZW50cy9tYXBzSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL292ZXJsYXlNZW51SGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL3Byb2plY3RvckhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NpdGUvY29tcG9uZW50cy9zY3JvbGxUb0hhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NpdGUvY29tcG9uZW50cy95b3V0dWJlSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9nbG9iYWwvYnJvd3NlckhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NpdGUvZ2xvYmFsL2hlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NpdGUvZ2xvYmFsL3Njcm9sbEhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL3Nhc3Mva21zL3N0eWxlcy5zYXNzPzU1N2YiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL3Nhc3Mvc2l0ZS9zdHlsZS5zY3NzP2U4NmUiXSwibmFtZXMiOlsiQWRkcmVzcyIsIl9zdHJlZXQiLCJfaG91c2VfbnVtYmVyIiwiX3Bvc3RhbF9jb2RlIiwiX2NpdHkiLCJfcGhvbmUiLCJfY291bnRyeUlzbzMiLCJ0b0pTT04iLCJfdG9Kc29uIiwiYmluZCIsInZhbHVlIiwiQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlIiwiX3RvdGFsRXhWYXRBbmREaXNjb3VudHMiLCJfdG90YWxFeFZhdEFuZERpc2NvdW50c0Zvcm1hdHRlZCIsIl90b3RhbEV4VmF0IiwiX3RvdGFsRXhWYXRGb3JtYXR0ZWQiLCJfdmF0VG90YWwiLCJfdmF0VG90YWxGb3JtYXR0ZWQiLCJfc2hpcHBpbmdDb3N0cyIsIl9zaGlwcGluZ0Nvc3RzRm9ybWF0dGVkIiwiX3RvdGFsIiwiX3RvdGFsRm9ybWF0dGVkIiwiX3ZhdFBlcmNlbnRhZ2UiLCJfY291cG9uQ29kZXMiLCJqc29uIiwiaXMiLCJqc29uT2JqZWN0IiwiSlNPTiIsInBhcnNlIiwiaW5zdGFuY2UiLCJ0b3RhbEV4VmF0QW5kRGlzY291bnRzIiwidG90YWxFeFZhdEFuZERpc2NvdW50c0Zvcm1hdHRlZCIsInRvdGFsRXhWYXQiLCJ0b3RhbEV4VmF0Rm9ybWF0dGVkIiwidmF0VG90YWwiLCJ2YXRUb3RhbEZvcm1hdHRlZCIsInNoaXBwaW5nQ29zdHMiLCJzaGlwcGluZ0Nvc3RzRm9ybWF0dGVkIiwidG90YWwiLCJ0b3RhbEZvcm1hdHRlZCIsInZhdFBlcmNlbnRhZ2UiLCJjb3Vwb25Db2RlcyIsImxvZ0Vycm9ycyIsImUiLCJjb25zb2xlIiwiZXJyb3IiLCJoYXNPd25Qcm9wZXJ0eSIsIkFycmF5IiwiaXNBcnJheSIsIkNvdW50cnlMYW5ndWFnZXNSZXNwb25zZSIsIl9sYW5ndWFnZXMiLCJsYW5ndWFnZUNvdW50IiwibGFuZ3VhZ2VzIiwibGVuZ3RoIiwiaW5kZXgiLCJsYW5ndWFnZU9iamVjdCIsImxhbmd1YWdlIiwiTGFuZ3VhZ2UiLCJuYW1lIiwiZGlzcGxheU5hbWUiLCJuYXRpdmVOYW1lIiwidHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lIiwidGhyZWVMZXR0ZXJJc29MYW5ndWFnZU5hbWUiLCJwdXNoIiwibG9nIiwiRXJyb3JSZXNwb25zZSIsIl9tZXNzYWdlIiwiX2Vycm9ycyIsIm1lc3NhZ2UiLCJlcnJvcnMiLCJmaWVsZE5hbWUiLCJfbmFtZSIsIl9kaXNwbGF5TmFtZSIsIl9uYXRpdmVOYW1lIiwiX3R3b0xldHRlcklzb0xhbmd1YWdlTmFtZSIsIl90aHJlZUxldHRlcklzb0xhbmd1YWdlTmFtZSIsIlZhbGlkYXRpb25SZXNwb25zZSIsIl92YWxpZCIsInZhbGlkIiwiY3JlYXRlTmV3RXZlbnQiLCJldmVudE5hbWUiLCJldmVudCIsIkV2ZW50IiwiZG9jdW1lbnQiLCJjcmVhdGVFdmVudCIsImluaXRFdmVudCIsImRpc3BhdGNoRXZlbnRGb3JFbGVtZW50IiwiZWxlbWVudCIsImRpc3BhdGNoRXZlbnQiLCJmaXJlRXZlbnQiLCJldmVudFR5cGUiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJpc0Zpbml0ZSIsIk1hdGgiLCJmbG9vciIsImdsb2JhbCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwiZGVmaW5lIiwiZmluYWxseUNvbnN0cnVjdG9yIiwiY2FsbGJhY2siLCJjb25zdHJ1Y3RvciIsInRoZW4iLCJyZXNvbHZlIiwicmVhc29uIiwicmVqZWN0Iiwic2V0VGltZW91dEZ1bmMiLCJzZXRUaW1lb3V0Iiwibm9vcCIsImZuIiwidGhpc0FyZyIsImFwcGx5IiwiYXJndW1lbnRzIiwiUHJvbWlzZSIsIlR5cGVFcnJvciIsIl9zdGF0ZSIsIl9oYW5kbGVkIiwiX3ZhbHVlIiwidW5kZWZpbmVkIiwiX2RlZmVycmVkcyIsImRvUmVzb2x2ZSIsImhhbmRsZSIsInNlbGYiLCJkZWZlcnJlZCIsIl9pbW1lZGlhdGVGbiIsImNiIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwicHJvbWlzZSIsInJldCIsIm5ld1ZhbHVlIiwiZmluYWxlIiwiX3VuaGFuZGxlZFJlamVjdGlvbkZuIiwiaSIsImxlbiIsIkhhbmRsZXIiLCJkb25lIiwiZXgiLCJwcm90b3R5cGUiLCJwcm9tIiwiYWxsIiwiYXJyIiwiYXJncyIsInNsaWNlIiwiY2FsbCIsInJlbWFpbmluZyIsInJlcyIsInZhbCIsInJhY2UiLCJ2YWx1ZXMiLCJzZXRJbW1lZGlhdGUiLCJlcnIiLCJ3YXJuIiwiZ2xvYmFsTlMiLCJ3aW5kb3ciLCJFcnJvciIsIkNoZWNrb3V0Q29udHJvbGxlciIsImNoZWNrb3V0Rm9ybURpdkVsZW1lbnQiLCJzaG9wcGluZ2NhcnRTZXJ2aWNlIiwiY2hlY2tvdXRTZXJ2aWNlIiwidmFsaWRhdGlvblNlcnZpY2UiLCJnbG9iYWxpc2F0aW9uU2VydmljZSIsImVycm9yRm9ybUNvbnRyb2xsZXIiLCJ0YWdOYW1lIiwiX2NoZWNrb3V0Rm9ybSIsInNlbGVjdEFuZFZhbGlkYXRlRWxlbWVudCIsIl9hZGRDb3Vwb25CdXR0b24iLCJfY291cG9uSW5wdXQiLCJfY291cG9uQ29kZXNMaXN0IiwiX3N1Ym1pdEJ1dHRvbiIsIl90b3RhbEV4VmF0QW5kRGlzY291bnRzQ29udGFpbmVyIiwiX3RvdGFsRXhWYXRDb250YWluZXIiLCJfdmF0Q29udGFpbmVyIiwiX3ZhdFBlcmNlbnRhZ2VDb250YWluZXIiLCJfc2hpcHBpbmdDb3N0c0NvbnRhaW5lciIsIl90b3RhbENvbnRhaW5lciIsIl9ndWVzdExhbmd1YWdlU2VsZWN0V3JhcHBlciIsInF1ZXJ5U2VsZWN0b3IiLCJfY2hlY2tvdXRTZXJ2aWNlIiwiQ2hlY2tvdXRTZXJ2aWNlIiwiX2dsb2JhbGlzYXRpb25TZXJ2aWNlIiwiX3Nob3BwaW5nY2FydFNlcnZpY2UiLCJTaG9wcGluZ2NhcnRTZXJ2aWNlIiwiX3ZhbGlkYXRpb25TZXJ2aWNlIiwiVmFsaWRhdGlvblNlcnZpY2UiLCJfZXJyb3JGb3JtQ29udHJvbGxlciIsIkVycm9yRm9ybUNvbnRyb2xsZXIiLCJfZG9tUGFyc2VyIiwiRE9NUGFyc2VyIiwiX2hpZGRlbkNsYXNzIiwiX2Zvcm1TdWJtaXQiLCJfZm9ybUNoYW5nZWQiLCJfcmVtb3ZlQ291cG9uQ29kZUNsaWNrZWQiLCJfaGFuZGxlRXJyb3JSZXNwb25zZSIsIl9jcmVhdGVIdG1sRWxlbWVudEZyb21TdHJpbmciLCJjb250cm9sTGlzdGVuZXJzIiwiX2d1ZXN0Q291bnRyeUNoYW5nZWQiLCJzZWxlY3RvciIsInZhbGlkQ2FsbEJhY2siLCJlbmFibGVkIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmb3JFYWNoIiwiZGVsZXRlQnV0dG9uRWxlbWVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJwcmV2ZW50RGVmYXVsdCIsImN1cnJlbnRUYXJnZXQiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsIl92YWxpZGF0ZUZvcm0iLCJzdWJtaXQiLCJfYWRkQ291cG9uQ29kZSIsImNvdXBvbiIsInRhcmdldCIsImluY2x1ZGVzIiwiX3VwZGF0ZVNoaXBwaW5nQ29zdHMiLCJmb3JtRGF0YSIsIkZvcm1EYXRhIiwiYWRkcmVzcyIsInN0cmVldCIsImdldCIsImhvdXNlX251bWJlciIsInBvc3RhbF9jb2RlIiwiY2l0eSIsInBob25lIiwiY291bnRyeUlzbzMiLCJzZXRTaGlwcGluZ0FkZHJlc3MiLCJyZXNwb25zZSIsImdldENoZWNrb3V0SW5mb3JtYXRpb24iLCJjaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UiLCJfdXBkYXRlRm9ybVVzaW5nQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlIiwiaW5uZXJIVE1MIiwiY2hpbGRyZW4iLCJyZW1vdmVDaGlsZCIsImZpcnN0Q2hpbGQiLCJjb3Vwb25Db2RlIiwiY291cG9uQ29kZUxpc3RJdGVtIiwiYXBwZW5kQ2hpbGQiLCJ2YWxpZGF0ZUNoZWNrb3V0Rm9ybSIsImNsZWFyQWxsRXJyb3JzIiwiZXJyb3JSZXNwb25zZSIsImVudGVyZWRDb3Vwb24iLCJhZGRDb3Vwb24iLCJyZW1vdmVDb3Vwb24iLCJjb2RlIiwicGFyZW50RWxlbWVudCIsImRhdGFzZXQiLCJfcmVtb3ZlQ291cG9uQ29kZSIsInNlbGVjdCIsImhhcyIsImdldExhbmd1YWdlc0ZvckNvdW50cnlXaXRoSXNvMyIsImNvdW50cnlMYW5ndWFnZXNSZXNwb25zZSIsIl9jbGVhckxhbmd1YWdlU2VsZWN0Iiwib3B0aW9uRWxlbWVudCIsImFkZCIsInJlbW92ZSIsImZpZWxkIiwiam9pbiIsInNldEZpZWxkRXJyb3IiLCJmcm9tIiwicGFyc2VGcm9tU3RyaW5nIiwiYm9keSIsIl9iYXNlUm91dGUiLCJBamF4IiwicG9zdCIsInhociIsImZyb21Kc29uU3RyaW5nIiwiaXNFcnJvclJlc3BvbnNlIiwiaXNDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UiLCJFcnJvckNvbnRyb2xsZXIiLCJfY2xhc3NUb0hpZGUiLCJfZXJyb3JFbGVtZW50SWRTdWZmaXgiLCJmaWVsZFNlbGVjdG9yIiwiZXJyb3JFbGVtZW50IiwiaW5uZXJUZXh0IiwiU2hvcHBpbmdjYXJ0Q29udHJvbGxlciIsIndyYXBwZXIiLCJfd3JhcHBlciIsIl9hZGRUb1Nob3BwaW5nY2FydEJ1dHRvbnMiLCJfcmVtb3ZlRnJvbVNob3BwaW5nY2FydEJ1dHRvbnMiLCJfY2hhbmdlUXVhbnRpdHlTaG9wcGluZ2NhcnRJdGVtQnV0dG9ucyIsImFkZFByb2R1Y3RCdXR0b25DbGlja2VkIiwicmVtb3ZlUHJvZHVjdEJ1dHRvbkNsaWNrZWQiLCJjaGFuZ2VRdWFudGl0eUJ1dHRvbkNsaWNrZWQiLCJlbmFibGUiLCJhZGRUb1Nob3BwaW5nY2FydEJ1dHRvbnNMZW5ndGgiLCJyZW1vdmVGcm9tU2hvcHBpbmdjYXJ0QnV0dG9uc0xlbmd0aCIsImNoYW5nZVF1YW50aXR5U2hvcHBpbmdjYXJ0SXRlbUJ1dHRvbnNMZW5ndGgiLCJfYWRkUHJvZHVjdFRvU2hvcHBpbmdjYXJ0IiwicHJvZHVjdElkIiwicHJvZHVjdFR5cGUiLCJfcmVtb3ZlSXRlbUZyb21TaG9wcGluZ2NhcnQiLCJfc2V0SXRlbVF1YW50aXR5SW5TaG9wcGluZ2NhcnQiLCJzaG9wcGluZ2NhcnRJdGVtSWQiLCJxdWFudGl0eSIsImNvdW50IiwiY291bnRlciIsImlkIiwidHlwZSIsInByb2R1Y3RhYmxlSWQiLCJpdGVtVHlwZSIsImxvY2F0aW9uIiwiaXRlbUlkIiwiZGF0YSIsInBvc3RGb3JtRGF0YSIsInJlcXVpcmUiLCJHbG9iYWxpc2F0aW9uU2VydmljZSIsInNob3BwaW5nQ2FydERpdkVsZW1lbnQiLCJyZWdpc3RlckZvcm0iLCJnZXRFbGVtZW50QnlJZCIsIlJlZ2lzdGVyQ29udHJvbGxlciIsImlzQ291bnRyeUxhbmd1YWdlc1Jlc3BvbnNlIiwiX2NvdW50cnlTZWxlY3QiLCJfbGFuZ3VhZ2VTZWxlY3QiLCJfbGFuZ3VhZ2VTZWxlY3RXcmFwcGVyIiwiX2NvdW50cnlDaGFuZ2VkIiwiQ2hvY29sYXRlRmFjdG9yeSIsImJhbm5lZFZpc2l0b3IiLCJlbnRlciIsImNob2NvbGF0ZUZhY3RvcmllcyIsImlzc2V0IiwiYW1vdW50T2ZDaG9jb2xhdGVGYWN0b3JpZXMiLCJDaG9jb2xhdGVCYXIiLCJfZmxhc2hUaWNrZXQiLCJjaG9jb2xhdGVCYXIiLCJnb2xkZW5UaWNrZXQiLCJlbmpveVRoZVRvdXIiLCJjaG9jb2xhdGVGYWN0b3J5IiwidG91ckdyb3VwIiwib29tcGFMb29tcGFzIiwiYW1vdW50T2ZPb21wYUxvb21wYXMiLCJ0b3VyR3JvdXBTaXplIiwidmlzaXRvciIsInZpc2l0b3JOYW1lIiwiZ2V0QXR0cmlidXRlIiwiX2lzVmlzaXRvckJhbm5lZCIsIl9nZXRBcnJhbmdlbWVudCIsIl9maW5pc2hUb3VyIiwiaW5kZXhPZiIsInZpc2l0b3JUeXBlIiwibm9kZU5hbWUiLCJncm91cCIsIl9hZGRXaWxsaWVXb25rYSIsImdhdGUiLCJIdHRwUmVxdWVzdCIsInN0YXR1cyIsIl90aGFua3NGb3JWaXNpdGluZyIsInJlZGlyZWN0VXJsIiwiX2dpdmVGZWVkYmFja1RvTWVtYmVycyIsIl91bmtub3duR2FwSW5GYWN0b3J5IiwiX3dpbGxpZSIsImZlZWRiYWNrQXJlYSIsIl9jbGVhclByZXZpb3VzTWFya2VkSmFja2V0cyIsIk9iamVjdCIsImtleXMiLCJqYWNrZXQiLCJ2aXNpdG9yRmVlZGJhY2tBcmVhIiwidmlzaXRvck5vZGUiLCJfZ3JhYlZpc2l0b3JKYWNrZXQiLCJ2aXNpdG9yRmVlZGJhY2siLCJ2aXNpdG9yRmVlZGJhY2tBbW91bnQiLCJ2aXNpdG9yRmVlZGJhY2tMaW5lIiwiY3VycmVudEZlZWRiYWNrQXJlYSIsImNhcGl0YWxpemVGaXJzdExldHRlciIsIm1hcmtlZEphY2tldHMiLCJtYXJrZWRKYWNrZXRzQW1vdW50IiwiY3VycmVudExheWVyIiwic2FmZXR5QnJlYWsiLCJwYXJlbnROb2RlIiwibmV4dFN0b3AiLCJDb29raWVIYW5kbGVyIiwiY29va2llQmFyIiwiY29va2llT3ZlcmxheSIsImNvb2tpZU1lc3NhZ2UiLCJjb29raWVTd2l0Y2giLCJjb29raWVGYWRlT3V0QW5pbWF0aW9uRHVyYXRpb24iLCJhY2NlcHRUcmFja2luZyIsImluaXQiLCJpbml0Q29va2llQmFyIiwiaW5pdENvb2tpZU92ZXJsYXkiLCJjaGVja0ZvckNvb2tpZVNldHRpbmdzIiwiaW5pdENvb2tpZVN3aXRjaCIsImNsb3NlQnV0dG9uIiwiY2xvc2VDb29raWVNZXNzYWdlIiwib3BlbkNvb2tpZVNldHRpbmdzQnV0dG9uIiwib3BlbkNvb2tpZVNldHRpbmdzIiwidG9nZ2xlVHJhY2tpbmdJbnB1dCIsImNoZWNrZWQiLCJ0b2dnbGVUcmFja2luZ1NldHRpbmciLCJhY2NlcHRCdXR0b24iLCJzZXRDb29raWVTZXR0aW5ncyIsInNhdmVCdXR0b24iLCJDb29raWUiLCJzZXQiLCJlcmFzZSIsInJlbG9hZCIsIk1hcHNIYW5kbGVyIiwibWFwcyIsImtleSIsIm1hcCIsImhhc0F0dHJpYnV0ZSIsImxhdCIsInBhcnNlRmxvYXQiLCJsbmciLCJub2RlIiwic3R5bGVzIiwic2V0Q3VzdG9tU3R5bGluZyIsImdvb2dsZSIsImdldFNjcmlwdCIsImRyYXdNYXBzIiwiZ29vZ2xlTWFwIiwiTWFwIiwiem9vbSIsImNlbnRlciIsImRpc2FibGVEZWZhdWx0VUkiLCJtYXJrZXIiLCJNYXJrZXIiLCJwb3NpdGlvbiIsImJvZHlTY3JvbGxMb2NrIiwiT3ZlcmxheU1lbnVIYW5kbGVyIiwib3ZlcmxheU1lbnVUcmlnZ2VyTGlzdCIsIm92ZXJsYXlNZW51VHJpZ2dlckxpc3RDb3VudCIsIm92ZXJsYXlNZW51VHJpZ2dlciIsImluaXRPdmVybGF5TWVudSIsInRvZ2dsZU92ZXJsYXlNZW51Iiwib3ZlcmxheU1lbnVOYXYiLCJlbmFibGVCb2R5U2Nyb2xsIiwiZWxlbSIsInRhYkluZGV4IiwiZGlzYWJsZUJvZHlTY3JvbGwiLCJ0b2dnbGUiLCJoaWRkZW4iLCJwcm9qZWN0b3JzIiwicHJvamVjdG9yQ29udGFpbmVycyIsInByb2plY3RvckNvbnRhaW5lcnNMZW5ndGgiLCJwcm9qZWN0b3IiLCJwcm9qZWN0b3JJZCIsInByb2plY3RvclNldHRpbmciLCJQcm9qZWN0b3JTZXR0aW5nIiwic2xpZGVySWQiLCJzbGlkZVF1ZXJ5IiwibmF2aWdhdGlvbkJ1dHRvbnMiLCJkb3RzIiwiYXV0b1NsaWRlIiwic2xpZGVySW50ZXJ2YWwiLCJQcm9qZWN0b3IiLCJwcmVwYXJlUGFyYW1ldGVycyIsInNldHRpbmdzT2JqZWN0IiwiZGVmaW5lZFByZXZpb3VzTmV4dCIsImNhcHRpb25zIiwic2V0UHJvamVjdG9ySWQiLCJzdHJpbmciLCJzZXREZWZpbmVkUHJldmlvdXNOZXh0IiwiYm9vbGVhbiIsInNldEF1dG9TbGlkZSIsInNldFNsaWRlckludGVydmFsIiwiaW50ZWdlciIsInNldFNsaWRlUXVlcnkiLCJzZXROYXZpZ2F0aW9uQnV0dG9ucyIsInNldERvdHMiLCJzZXRDYXB0aW9ucyIsImdldFByb2plY3RvcklkIiwiZ2V0RGVmaW5lZFByZXZpb3VzTmV4dCIsImdldEF1dG9TbGlkZSIsImdldFNsaWRlckludGVydmFsIiwiZ2V0U2xpZGVRdWVyeSIsImdldE5hdmlnYXRpb25CdXR0b25zIiwiZ2V0RG90cyIsImdldENhcHRpb25zIiwiZmlsbCIsInNldHRpbmdzT2JqZWN0S2V5cyIsInNldHRpbmdzT2JqZWN0TGVuZ3RoIiwic2V0dGluZ3MiLCJzbGlkZXJPYmplY3QiLCJhY3RpdmVTbGlkZUlkIiwicHJldmlvdXNTbGlkZUlkIiwibmV4dFNsaWRlSWQiLCJhdmFpbGFibGVTbGlkZXMiLCJzbGlkZXMiLCJhdXRvU2xpZGVJbnRlcnZhbCIsInNldFByZXZpb3VzQW5kTmV4dFNsaWRlIiwic2V0U2xpZGUiLCJzd2lwZUdlc3R1cmVzIiwiSGFtbWVyIiwib24iLCJyZXNldEF1dG9TbGlkZSIsIm5leHRTbGlkZSIsInByZXZpb3VzU2xpZGUiLCJuYXZpZ2F0aW9uQnV0dG9uc0xlbmd0aCIsIm5hdmlnYXRpb25CdXR0b24iLCJjbGlja05hdmlnYXRpb25CdXR0b24iLCJkb3RzTGVuZ3RoIiwiZG90IiwiY2xpY2tEb3QiLCJjbGVhckludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJzbGlkZXNMZW5ndGgiLCJzbGlkZSIsInNsaWRlT3JkZXIiLCJwYXJzZUludCIsInNldEFjdGl2ZURvdCIsInNldEFjdGl2ZUNhcHRpb24iLCJuYXZCdXR0b24iLCJuZXh0IiwicHJldmlvdXMiLCJzZXRBdHRyaWJ1dGUiLCJjbGlja2VkRG90IiwiZG90T3JkZXIiLCJjYXB0aW9uc0xlbmd0aCIsImNhcHRpb24iLCJjYXB0aW9uT3JkZXIiLCJTY3JvbGxUb0hhbmRsZXIiLCJvZmZzZXQiLCJkdXJhdGlvbiIsInN0YXJ0IiwiY2hhbmdlIiwiY3VycmVudFRpbWUiLCJhbGxvd0FuaW1hdGlvbiIsInNjcm9sbFRvQW5pbWF0aW9uIiwiZWFzaW5nIiwiYW5jaG9yTGlua3MiLCJhbmNob3JMaW5rc0Ftb3VudCIsImFuY2hvckxpbmsiLCJwcmVwYXJlU2Nyb2xsVG8iLCJlbGVtZW50SWQiLCJzdWJzdHIiLCJzY3JvbGxUb0VsZW1lbnQiLCJzY3JvbGxUb0VsZW1lbnRQb3NpdGlvbiIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImRvY3VtZW50RWxlbWVudCIsIm1heCIsInNjcm9sbFRvcCIsInBhZ2VZT2Zmc2V0IiwidG9wIiwic3RhcnRUaW1lIiwicGVyZm9ybWFuY2UiLCJub3ciLCJEYXRlIiwiZ2V0VGltZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImFuaW1hdGVTY3JvbGwiLCJhYm9ydFNjcm9sbEFuaW1hdGlvbiIsInRpbWVzdGFtcCIsInByb2dyZXNzIiwibWluIiwiRWFzaW5nRnVuY3Rpb25zIiwibmV3U2Nyb2xsVG9wIiwiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJZb3V0dWJlSGFuZGxlciIsInlvdXR1YmVDbGFzcyIsInBsYXllcnMiLCJ5b3V0dWJlUGxheWVycyIsInlvdXR1YmVQbGF5ZXJzQW1vdW50IiwieW91dHViZVBsYXllciIsInlvdXR1YmVQbGF5ZXJJZCIsInlvdXR1YmVFbGVtZW50IiwibGluayIsImF1dG9QbGF5IiwiaW5pdFlvdXR1YmUiLCJZVCIsIlBsYXllciIsIm9uWW91VHViZVBsYXllckFQSVJlYWR5IiwibG9hZFBsYXllcnMiLCJwbGF5ZXIiLCJoZWlnaHQiLCJ3aWR0aCIsInZpZGVvSWQiLCJob3N0IiwicGxheWVyVmFycyIsIm1vZGVzdGJyYW5kaW5nIiwicmVsIiwiZGlzYWJsZWtiIiwiYXV0b3BsYXkiLCJldmVudHMiLCJvblN0YXRlQ2hhbmdlIiwib25SZWFkeSIsInBsYXllckNvbnRhaW5lcklkIiwiZ2V0SWZyYW1lIiwidmlkZW9TdGF0ZSIsIlBsYXllclN0YXRlIiwiRU5ERUQiLCJwbGF5VmlkZW8iLCJCcm93c2VySGFuZGxlciIsInVzZXJBZ2VudCIsImJyb3dzZXJJbmZvIiwibmF2aWdhdG9yIiwiZ2V0QnJvd3NlckluZm8iLCJoYW5kbGVJRSIsImhhbmRsZVNhZmFyaSIsIm1zaWUiLCJpZWx0MTEiLCJpZTExIiwibWF0Y2giLCJ2ZXJzaW9uIiwic3Vic3RyaW5nIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJ1YSIsInRlbSIsIk0iLCJ0ZXN0IiwiZXhlYyIsImFwcE5hbWUiLCJhcHBWZXJzaW9uIiwic3BsaWNlIiwib2JqIiwibGluZWFyIiwidCIsImVhc2VJblF1YWQiLCJlYXNlT3V0UXVhZCIsImVhc2VJbk91dFF1YWQiLCJlYXNlSW5DdWJpYyIsImVhc2VPdXRDdWJpYyIsImVhc2VJbk91dEN1YmljIiwiZWFzZUluUXVhcnQiLCJlYXNlT3V0UXVhcnQiLCJlYXNlSW5PdXRRdWFydCIsImVhc2VJblF1aW50IiwiZWFzZU91dFF1aW50IiwiZWFzZUluT3V0UXVpbnQiLCJzb3VyY2UiLCJzY3JpcHQiLCJjcmVhdGVFbGVtZW50IiwiYXN5bmMiLCJzY3JpcHRzIiwicHJpb3IiLCJvbmxvYWQiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJfIiwiaXNBYm9ydCIsInJlYWR5U3RhdGUiLCJzcmMiLCJpbnNlcnRCZWZvcmUiLCJkZWJvdW5jZSIsImZ1bmMiLCJ3YWl0IiwiaW1tZWRpYXRlIiwidGltZW91dCIsImNvbnRleHQiLCJsYXRlciIsImNhbGxOb3ciLCJjbGVhclRpbWVvdXQiLCJkYXlzIiwiZG9tYWluIiwiZG9tYWluUGFydHMiLCJkYXRlIiwiZXhwaXJlcyIsInNldFRpbWUiLCJ0b0dNVFN0cmluZyIsInNwbGl0IiwiY29va2llIiwic2hpZnQiLCJuYW1lRVEiLCJjYSIsImMiLCJjaGFyQXQiLCJudW1iZXJfZm9ybWF0IiwibnVtYmVyIiwiZGVjaW1hbHMiLCJkZWNfcG9pbnQiLCJ0aG91c2FuZHNfc2VwIiwicmVwbGFjZSIsIm4iLCJwcmVjIiwiYWJzIiwic2VwIiwiZGVjIiwicyIsInRvRml4ZWRGaXgiLCJrIiwicG93Iiwicm91bmQiLCJFbGVtZW50IiwiY2xvc2VzdCIsIm1hdGNoZXMiLCJtc01hdGNoZXNTZWxlY3RvciIsIndlYmtpdE1hdGNoZXNTZWxlY3RvciIsImVsIiwiYW5jZXN0b3IiLCJ1cmwiLCJYTUxIdHRwUmVxdWVzdCIsInRva2VuIiwiY29udGVudCIsIm9wZW4iLCJzZXRSZXF1ZXN0SGVhZGVyIiwic2VuZCIsInN0cmluZ2lmeSIsInRvVXBwZXJDYXNlIiwic25ha2VUb0NhbWVsIiwibSIsImluZGV4SW5QYXJlbnQiLCJjaGlsZE5vZGVzIiwibnVtIiwibm9kZVR5cGUiLCJjb3B5VG9DbGlwYm9hcmQiLCJlZGl0YWJsZSIsImNvbnRlbnRFZGl0YWJsZSIsInJlYWRPbmx5IiwicmFuZ2UiLCJjcmVhdGVSYW5nZSIsInNlbGVjdE5vZGVDb250ZW50cyIsInNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsInJlbW92ZUFsbFJhbmdlcyIsImFkZFJhbmdlIiwic2V0U2VsZWN0aW9uUmFuZ2UiLCJleGVjQ29tbWFuZCIsImJvZHlPZmZzZXQiLCJyZWN0Iiwic2Nyb2xsTGVmdCIsInBhZ2VYT2Zmc2V0IiwibGVmdCIsIlNjcm9sbEhhbmRsZXIiLCJ0aW1lIiwid2FpdFRocm90dGxlIiwid2FpdERlYm91bmNlIiwibGFzdFNjcm9sbFRvcFBvc2l0aW9uIiwic2Nyb2xsRGlyZWN0aW9uRG93biIsInNjcm9sbERpcmVjdGlvblVwIiwidHJpZ2dlck9uSW5pdCIsInRyaWdnZXJUaHJvdHRsZSIsInRyaWdnZXJTbW9vdGgiLCJ0cmlnZ2VyRGVib3VuY2UiLCJ0cmlnZ2VyRWxlbWVudEluVmlld3BvcnRBbmltYXRpb24iLCJkZXRlY3RTY3JvbGxEaXJlY3Rpb24iLCJ0b2dnbGVTdGlja3lIZWFkZXIiLCJkZXRlY3RJZkVsZW1lbnRJc1BhcnRseUluVmlld3BvcnQiLCJ3aW5kb3dIZWlnaHQiLCJpbm5lckhlaWdodCIsImNsaWVudEhlaWdodCIsIndpbmRvd1dpZHRoIiwiaW5uZXJXaWR0aCIsImNsaWVudFdpZHRoIiwidmVydGljYWxJblZpZXciLCJob3Jpem9udGFsSW5WaWV3IiwiZGV0ZWN0SWZFbGVtZW50SXNGdWxseUluVmlld3BvcnQiLCJib3R0b20iLCJzY3JvbGxUb3BQb3NpdGlvbiIsImVsZW1lbnRzIiwiZWxlbWVudHNMZW5ndGgiLCJzdGlja3lIZWFkZXIiLCJ2aXNpYmxlU3RpY2t5SGVhZGVyQ2xhc3MiLCJzdWJuYXZMaXN0Iiwic3ViTmF2SXNWaXNpYmxlIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsInZpc2liaWxpdHkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLGlCQUFpQixtQkFBTyxDQUFDLDBFQUFxQjs7Ozs7Ozs7Ozs7O0FDQTlDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsc0JBQXNCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFVBQVU7Ozs7Ozs7Ozs7OztBQ3ZMdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkLEtBQUs7QUFDTCxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQ0FBb0MsY0FBYztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUMsa0JBQWtCO0FBQ25EO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpQkFBaUI7QUFDekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FB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QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7Ozs7Ozs7Ozs7Ozs7QUN6TEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBLG1CQUFPLENBQUMsaUVBQWM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDOURBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDOztBQUU1Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkJBOzs7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Q0o7QUFwSmlCLENBQXRCO0FBd0pBN0IsYUFBYSxDQUFDOVUsSUFBZCxHOzs7Ozs7Ozs7OztBQzdKQSx5Qzs7Ozs7Ozs7Ozs7QUNBQSx5QyIsImZpbGUiOiIvanMvc2l0ZS9hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWdlbmVyYXRvci1ydW50aW1lXCIpO1xuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxudmFyIHJ1bnRpbWUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBleHBvcnRzLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBJdGVyYXRvclByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZVt0b1N0cmluZ1RhZ1N5bWJvbF0gPVxuICAgIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIHByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIGV4cG9ydHMubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgICAgaWYgKCEodG9TdHJpbmdUYWdTeW1ib2wgaW4gZ2VuRnVuKSkge1xuICAgICAgICBnZW5GdW5bdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgIC8vIElmIGEgcmVqZWN0ZWQgUHJvbWlzZSB3YXMgeWllbGRlZCwgdGhyb3cgdGhlIHJlamVjdGlvbiBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLlxuICAgICAgICAgIHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBBc3luY0l0ZXJhdG9yLnByb3RvdHlwZVthc3luY0l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpXG4gICAgKTtcblxuICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAvLyBOb3RlOiBbXCJyZXR1cm5cIl0gbXVzdCBiZSB1c2VkIGZvciBFUzMgcGFyc2luZyBjb21wYXRpYmlsaXR5LlxuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3JbXCJyZXR1cm5cIl0pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvclwiO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBleHBvcnRzLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGVcbiAgLy8gb3Igbm90LCByZXR1cm4gdGhlIHJ1bnRpbWUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGRlY2xhcmUgdGhlIHZhcmlhYmxlXG4gIC8vIHJlZ2VuZXJhdG9yUnVudGltZSBpbiB0aGUgb3V0ZXIgc2NvcGUsIHdoaWNoIGFsbG93cyB0aGlzIG1vZHVsZSB0byBiZVxuICAvLyBpbmplY3RlZCBlYXNpbHkgYnkgYGJpbi9yZWdlbmVyYXRvciAtLWluY2x1ZGUtcnVudGltZSBzY3JpcHQuanNgLlxuICByZXR1cm4gZXhwb3J0cztcblxufShcbiAgLy8gSWYgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlLCB1c2UgbW9kdWxlLmV4cG9ydHNcbiAgLy8gYXMgdGhlIHJlZ2VuZXJhdG9yUnVudGltZSBuYW1lc3BhY2UuIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgZW1wdHlcbiAgLy8gb2JqZWN0LiBFaXRoZXIgd2F5LCB0aGUgcmVzdWx0aW5nIG9iamVjdCB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZVxuICAvLyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIHZhcmlhYmxlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLlxuICB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiID8gbW9kdWxlLmV4cG9ydHMgOiB7fVxuKSk7XG5cbnRyeSB7XG4gIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7XG59IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkge1xuICAvLyBUaGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUsIHNvIHRoZSBhYm92ZVxuICAvLyBhc3NpZ25tZW50IHNob3VsZCBhbHdheXMgd29yayB1bmxlc3Mgc29tZXRoaW5nIGlzIG1pc2NvbmZpZ3VyZWQuIEp1c3RcbiAgLy8gaW4gY2FzZSBydW50aW1lLmpzIGFjY2lkZW50YWxseSBydW5zIGluIHN0cmljdCBtb2RlLCB3ZSBjYW4gZXNjYXBlXG4gIC8vIHN0cmljdCBtb2RlIHVzaW5nIGEgZ2xvYmFsIEZ1bmN0aW9uIGNhbGwuIFRoaXMgY291bGQgY29uY2VpdmFibHkgZmFpbFxuICAvLyBpZiBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGZvcmJpZHMgdXNpbmcgRnVuY3Rpb24sIGJ1dCBpbiB0aGF0IGNhc2VcbiAgLy8gdGhlIHByb3BlciBzb2x1dGlvbiBpcyB0byBmaXggdGhlIGFjY2lkZW50YWwgc3RyaWN0IG1vZGUgcHJvYmxlbS4gSWZcbiAgLy8geW91J3ZlIG1pc2NvbmZpZ3VyZWQgeW91ciBidW5kbGVyIHRvIGZvcmNlIHN0cmljdCBtb2RlIGFuZCBhcHBsaWVkIGFcbiAgLy8gQ1NQIHRvIGZvcmJpZCBGdW5jdGlvbiwgYW5kIHlvdSdyZSBub3Qgd2lsbGluZyB0byBmaXggZWl0aGVyIG9mIHRob3NlXG4gIC8vIHByb2JsZW1zLCBwbGVhc2UgZGV0YWlsIHlvdXIgdW5pcXVlIHByZWRpY2FtZW50IGluIGEgR2l0SHViIGlzc3VlLlxuICBGdW5jdGlvbihcInJcIiwgXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKHJ1bnRpbWUpO1xufVxuIiwiKGZ1bmN0aW9uIChnbG9iYWwsIHVuZGVmaW5lZCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgaWYgKGdsb2JhbC5zZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBuZXh0SGFuZGxlID0gMTsgLy8gU3BlYyBzYXlzIGdyZWF0ZXIgdGhhbiB6ZXJvXG4gICAgdmFyIHRhc2tzQnlIYW5kbGUgPSB7fTtcbiAgICB2YXIgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgdmFyIGRvYyA9IGdsb2JhbC5kb2N1bWVudDtcbiAgICB2YXIgcmVnaXN0ZXJJbW1lZGlhdGU7XG5cbiAgICBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoY2FsbGJhY2spIHtcbiAgICAgIC8vIENhbGxiYWNrIGNhbiBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhIHN0cmluZ1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNhbGxiYWNrID0gbmV3IEZ1bmN0aW9uKFwiXCIgKyBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgICAvLyBDb3B5IGZ1bmN0aW9uIGFyZ3VtZW50c1xuICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMV07XG4gICAgICB9XG4gICAgICAvLyBTdG9yZSBhbmQgcmVnaXN0ZXIgdGhlIHRhc2tcbiAgICAgIHZhciB0YXNrID0geyBjYWxsYmFjazogY2FsbGJhY2ssIGFyZ3M6IGFyZ3MgfTtcbiAgICAgIHRhc2tzQnlIYW5kbGVbbmV4dEhhbmRsZV0gPSB0YXNrO1xuICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUobmV4dEhhbmRsZSk7XG4gICAgICByZXR1cm4gbmV4dEhhbmRsZSsrO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGhhbmRsZSkge1xuICAgICAgICBkZWxldGUgdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bih0YXNrKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHRhc2suY2FsbGJhY2s7XG4gICAgICAgIHZhciBhcmdzID0gdGFzay5hcmdzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bklmUHJlc2VudChoYW5kbGUpIHtcbiAgICAgICAgLy8gRnJvbSB0aGUgc3BlYzogXCJXYWl0IHVudGlsIGFueSBpbnZvY2F0aW9ucyBvZiB0aGlzIGFsZ29yaXRobSBzdGFydGVkIGJlZm9yZSB0aGlzIG9uZSBoYXZlIGNvbXBsZXRlZC5cIlxuICAgICAgICAvLyBTbyBpZiB3ZSdyZSBjdXJyZW50bHkgcnVubmluZyBhIHRhc2ssIHdlJ2xsIG5lZWQgdG8gZGVsYXkgdGhpcyBpbnZvY2F0aW9uLlxuICAgICAgICBpZiAoY3VycmVudGx5UnVubmluZ0FUYXNrKSB7XG4gICAgICAgICAgICAvLyBEZWxheSBieSBkb2luZyBhIHNldFRpbWVvdXQuIHNldEltbWVkaWF0ZSB3YXMgdHJpZWQgaW5zdGVhZCwgYnV0IGluIEZpcmVmb3ggNyBpdCBnZW5lcmF0ZWQgYVxuICAgICAgICAgICAgLy8gXCJ0b28gbXVjaCByZWN1cnNpb25cIiBlcnJvci5cbiAgICAgICAgICAgIHNldFRpbWVvdXQocnVuSWZQcmVzZW50LCAwLCBoYW5kbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHRhc2sgPSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgICAgICAgICBpZiAodGFzaykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IHRydWU7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcnVuKHRhc2spO1xuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW1tZWRpYXRlKGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7IHJ1bklmUHJlc2VudChoYW5kbGUpOyB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYW5Vc2VQb3N0TWVzc2FnZSgpIHtcbiAgICAgICAgLy8gVGhlIHRlc3QgYWdhaW5zdCBgaW1wb3J0U2NyaXB0c2AgcHJldmVudHMgdGhpcyBpbXBsZW1lbnRhdGlvbiBmcm9tIGJlaW5nIGluc3RhbGxlZCBpbnNpZGUgYSB3ZWIgd29ya2VyLFxuICAgICAgICAvLyB3aGVyZSBgZ2xvYmFsLnBvc3RNZXNzYWdlYCBtZWFucyBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQgYW5kIGNhbid0IGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS5cbiAgICAgICAgaWYgKGdsb2JhbC5wb3N0TWVzc2FnZSAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBvbGRPbk1lc3NhZ2UgPSBnbG9iYWwub25tZXNzYWdlO1xuICAgICAgICAgICAgZ2xvYmFsLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSBmYWxzZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoXCJcIiwgXCIqXCIpO1xuICAgICAgICAgICAgZ2xvYmFsLm9ubWVzc2FnZSA9IG9sZE9uTWVzc2FnZTtcbiAgICAgICAgICAgIHJldHVybiBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIC8vIEluc3RhbGxzIGFuIGV2ZW50IGhhbmRsZXIgb24gYGdsb2JhbGAgZm9yIHRoZSBgbWVzc2FnZWAgZXZlbnQ6IHNlZVxuICAgICAgICAvLyAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0RPTS93aW5kb3cucG9zdE1lc3NhZ2VcbiAgICAgICAgLy8gKiBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS9jb21tcy5odG1sI2Nyb3NzRG9jdW1lbnRNZXNzYWdlc1xuXG4gICAgICAgIHZhciBtZXNzYWdlUHJlZml4ID0gXCJzZXRJbW1lZGlhdGUkXCIgKyBNYXRoLnJhbmRvbSgpICsgXCIkXCI7XG4gICAgICAgIHZhciBvbkdsb2JhbE1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gZ2xvYmFsICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGV2ZW50LmRhdGEgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBldmVudC5kYXRhLmluZGV4T2YobWVzc2FnZVByZWZpeCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoK2V2ZW50LmRhdGEuc2xpY2UobWVzc2FnZVByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBvbkdsb2JhbE1lc3NhZ2UsIGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsb2JhbC5hdHRhY2hFdmVudChcIm9ubWVzc2FnZVwiLCBvbkdsb2JhbE1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShtZXNzYWdlUHJlZml4ICsgaGFuZGxlLCBcIipcIik7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBldmVudC5kYXRhO1xuICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUmVhZHlTdGF0ZUNoYW5nZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgaHRtbCA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSA8c2NyaXB0PiBlbGVtZW50OyBpdHMgcmVhZHlzdGF0ZWNoYW5nZSBldmVudCB3aWxsIGJlIGZpcmVkIGFzeW5jaHJvbm91c2x5IG9uY2UgaXQgaXMgaW5zZXJ0ZWRcbiAgICAgICAgICAgIC8vIGludG8gdGhlIGRvY3VtZW50LiBEbyBzbywgdGh1cyBxdWV1aW5nIHVwIHRoZSB0YXNrLiBSZW1lbWJlciB0byBjbGVhbiB1cCBvbmNlIGl0J3MgYmVlbiBjYWxsZWQuXG4gICAgICAgICAgICB2YXIgc2NyaXB0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICBzY3JpcHQgPSBudWxsO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSWYgc3VwcG9ydGVkLCB3ZSBzaG91bGQgYXR0YWNoIHRvIHRoZSBwcm90b3R5cGUgb2YgZ2xvYmFsLCBzaW5jZSB0aGF0IGlzIHdoZXJlIHNldFRpbWVvdXQgZXQgYWwuIGxpdmUuXG4gICAgdmFyIGF0dGFjaFRvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihnbG9iYWwpO1xuICAgIGF0dGFjaFRvID0gYXR0YWNoVG8gJiYgYXR0YWNoVG8uc2V0VGltZW91dCA/IGF0dGFjaFRvIDogZ2xvYmFsO1xuXG4gICAgLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBlLmcuIGJyb3dzZXJpZnkgZW52aXJvbm1lbnRzLlxuICAgIGlmICh7fS50b1N0cmluZy5jYWxsKGdsb2JhbC5wcm9jZXNzKSA9PT0gXCJbb2JqZWN0IHByb2Nlc3NdXCIpIHtcbiAgICAgICAgLy8gRm9yIE5vZGUuanMgYmVmb3JlIDAuOVxuICAgICAgICBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChjYW5Vc2VQb3N0TWVzc2FnZSgpKSB7XG4gICAgICAgIC8vIEZvciBub24tSUUxMCBtb2Rlcm4gYnJvd3NlcnNcbiAgICAgICAgaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZ2xvYmFsLk1lc3NhZ2VDaGFubmVsKSB7XG4gICAgICAgIC8vIEZvciB3ZWIgd29ya2Vycywgd2hlcmUgc3VwcG9ydGVkXG4gICAgICAgIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGRvYyAmJiBcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiIGluIGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpKSB7XG4gICAgICAgIC8vIEZvciBJRSA24oCTOFxuICAgICAgICBpbnN0YWxsUmVhZHlTdGF0ZUNoYW5nZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3Igb2xkZXIgYnJvd3NlcnNcbiAgICAgICAgaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpO1xuICAgIH1cblxuICAgIGF0dGFjaFRvLnNldEltbWVkaWF0ZSA9IHNldEltbWVkaWF0ZTtcbiAgICBhdHRhY2hUby5jbGVhckltbWVkaWF0ZSA9IGNsZWFySW1tZWRpYXRlO1xufSh0eXBlb2Ygc2VsZiA9PT0gXCJ1bmRlZmluZWRcIiA/IHR5cGVvZiBnbG9iYWwgPT09IFwidW5kZWZpbmVkXCIgPyB0aGlzIDogZ2xvYmFsIDogc2VsZikpO1xuIiwidmFyIHNjb3BlID0gKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsKSB8fFxuICAgICAgICAgICAgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYpIHx8XG4gICAgICAgICAgICB3aW5kb3c7XG52YXIgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7XG5cbi8vIERPTSBBUElzLCBmb3IgY29tcGxldGVuZXNzXG5cbmV4cG9ydHMuc2V0VGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRUaW1lb3V0LCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJUaW1lb3V0KTtcbn07XG5leHBvcnRzLnNldEludGVydmFsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldEludGVydmFsLCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJJbnRlcnZhbCk7XG59O1xuZXhwb3J0cy5jbGVhclRpbWVvdXQgPVxuZXhwb3J0cy5jbGVhckludGVydmFsID0gZnVuY3Rpb24odGltZW91dCkge1xuICBpZiAodGltZW91dCkge1xuICAgIHRpbWVvdXQuY2xvc2UoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gVGltZW91dChpZCwgY2xlYXJGbikge1xuICB0aGlzLl9pZCA9IGlkO1xuICB0aGlzLl9jbGVhckZuID0gY2xlYXJGbjtcbn1cblRpbWVvdXQucHJvdG90eXBlLnVucmVmID0gVGltZW91dC5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24oKSB7fTtcblRpbWVvdXQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2NsZWFyRm4uY2FsbChzY29wZSwgdGhpcy5faWQpO1xufTtcblxuLy8gRG9lcyBub3Qgc3RhcnQgdGhlIHRpbWUsIGp1c3Qgc2V0cyB1cCB0aGUgbWVtYmVycyBuZWVkZWQuXG5leHBvcnRzLmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0sIG1zZWNzKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSBtc2Vjcztcbn07XG5cbmV4cG9ydHMudW5lbnJvbGwgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSAtMTtcbn07XG5cbmV4cG9ydHMuX3VucmVmQWN0aXZlID0gZXhwb3J0cy5hY3RpdmUgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcblxuICB2YXIgbXNlY3MgPSBpdGVtLl9pZGxlVGltZW91dDtcbiAgaWYgKG1zZWNzID49IDApIHtcbiAgICBpdGVtLl9pZGxlVGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiBvblRpbWVvdXQoKSB7XG4gICAgICBpZiAoaXRlbS5fb25UaW1lb3V0KVxuICAgICAgICBpdGVtLl9vblRpbWVvdXQoKTtcbiAgICB9LCBtc2Vjcyk7XG4gIH1cbn07XG5cbi8vIHNldGltbWVkaWF0ZSBhdHRhY2hlcyBpdHNlbGYgdG8gdGhlIGdsb2JhbCBvYmplY3RcbnJlcXVpcmUoXCJzZXRpbW1lZGlhdGVcIik7XG4vLyBPbiBzb21lIGV4b3RpYyBlbnZpcm9ubWVudHMsIGl0J3Mgbm90IGNsZWFyIHdoaWNoIG9iamVjdCBgc2V0aW1tZWRpYXRlYCB3YXNcbi8vIGFibGUgdG8gaW5zdGFsbCBvbnRvLiAgU2VhcmNoIGVhY2ggcG9zc2liaWxpdHkgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlXG4vLyBgc2V0aW1tZWRpYXRlYCBsaWJyYXJ5LlxuZXhwb3J0cy5zZXRJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuc2V0SW1tZWRpYXRlKTtcbmV4cG9ydHMuY2xlYXJJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5jbGVhckltbWVkaWF0ZSk7XG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCIvKipcbiAqIEFkZHJlc3MgbW9kZWwuXG4gKiBUbyBjYXJyeSBhcm91bmQgYWRkcmVzcyBkYXRhXG4gKi9cbmNsYXNzIEFkZHJlc3Mge1xuICAgIGNvbnN0cnVjdG9yKClcbiAgICB7XG4gICAgICAgIHRoaXMuX3N0cmVldCA9ICcnO1xuICAgICAgICB0aGlzLl9ob3VzZV9udW1iZXIgPSAnJztcbiAgICAgICAgdGhpcy5fcG9zdGFsX2NvZGUgPSAnJztcbiAgICAgICAgdGhpcy5fY2l0eSA9ICcnO1xuICAgICAgICB0aGlzLl9waG9uZSA9ICcnO1xuICAgICAgICB0aGlzLl9jb3VudHJ5SXNvMyA9ICcnO1xuICAgICAgICB0aGlzLnRvSlNPTiA9IHRoaXMuX3RvSnNvbi5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIGdldCBzdHJlZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJlZXQ7XG4gICAgfVxuXG4gICAgc2V0IHN0cmVldCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9zdHJlZXQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgaG91c2VfbnVtYmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faG91c2VfbnVtYmVyO1xuICAgIH1cblxuICAgIHNldCBob3VzZV9udW1iZXIodmFsdWUpIHtcbiAgICAgICAgdGhpcy5faG91c2VfbnVtYmVyID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IHBvc3RhbF9jb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9zdGFsX2NvZGU7XG4gICAgfVxuXG4gICAgc2V0IHBvc3RhbF9jb2RlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3Bvc3RhbF9jb2RlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IGNpdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaXR5O1xuICAgIH1cblxuICAgIHNldCBjaXR5KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NpdHkgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgcGhvbmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waG9uZTtcbiAgICB9XG5cbiAgICBzZXQgcGhvbmUodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fcGhvbmUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgY291bnRyeUlzbzMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudHJ5SXNvMztcbiAgICB9XG5cbiAgICBzZXQgY291bnRyeUlzbzModmFsdWUpIHtcbiAgICAgICAgdGhpcy5fY291bnRyeUlzbzMgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBfdG9Kc29uKClcbiAgICB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnc3RyZWV0JyA6IHRoaXMuX3N0cmVldCxcbiAgICAgICAgICAgICdob3VzZV9udW1iZXInIDogdGhpcy5faG91c2VfbnVtYmVyLFxuICAgICAgICAgICAgJ3Bvc3RhbF9jb2RlJyA6IHRoaXMuX3Bvc3RhbF9jb2RlLFxuICAgICAgICAgICAgJ2NpdHknIDogdGhpcy5fY2l0eSxcbiAgICAgICAgICAgICdwaG9uZScgOiB0aGlzLl9waG9uZSxcbiAgICAgICAgICAgICdjb3VudHJ5SXNvMycgOiB0aGlzLl9jb3VudHJ5SXNvMyxcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHsgQWRkcmVzcyB9IiwiY2xhc3MgQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fdG90YWxFeFZhdEFuZERpc2NvdW50cyA9IDA7XG4gICAgICAgIHRoaXMuX3RvdGFsRXhWYXRBbmREaXNjb3VudHNGb3JtYXR0ZWQgPSAnJztcbiAgICAgICAgdGhpcy5fdG90YWxFeFZhdCA9IDA7XG4gICAgICAgIHRoaXMuX3RvdGFsRXhWYXRGb3JtYXR0ZWQgPSAnJztcbiAgICAgICAgdGhpcy5fdmF0VG90YWwgPSAwO1xuICAgICAgICB0aGlzLl92YXRUb3RhbEZvcm1hdHRlZCA9ICcnO1xuICAgICAgICB0aGlzLl9zaGlwcGluZ0Nvc3RzID0gMDtcbiAgICAgICAgdGhpcy5fc2hpcHBpbmdDb3N0c0Zvcm1hdHRlZCA9ICcnO1xuICAgICAgICB0aGlzLl90b3RhbCA9IDA7XG4gICAgICAgIHRoaXMuX3RvdGFsRm9ybWF0dGVkID0gJyc7XG4gICAgICAgIHRoaXMuX3ZhdFBlcmNlbnRhZ2UgPSAwO1xuICAgICAgICB0aGlzLl9jb3Vwb25Db2RlcyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBqc29uXG4gICAgICogQHJldHVybiB7Q2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlfG51bGx9XG4gICAgICovXG4gICAgc3RhdGljIGZyb21Kc29uU3RyaW5nKGpzb24pIHtcbiAgICAgICAgaWYoIXRoaXMuaXMoanNvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBqc29uT2JqZWN0ID0gSlNPTi5wYXJzZShqc29uKTtcblxuICAgICAgICBsZXQgaW5zdGFuY2UgPSBuZXcgdGhpcztcbiAgICAgICAgaW5zdGFuY2UuX3RvdGFsRXhWYXRBbmREaXNjb3VudHMgPSBqc29uT2JqZWN0LnRvdGFsRXhWYXRBbmREaXNjb3VudHM7XG4gICAgICAgIGluc3RhbmNlLl90b3RhbEV4VmF0QW5kRGlzY291bnRzRm9ybWF0dGVkID0ganNvbk9iamVjdC50b3RhbEV4VmF0QW5kRGlzY291bnRzRm9ybWF0dGVkO1xuICAgICAgICBpbnN0YW5jZS5fdG90YWxFeFZhdCA9IGpzb25PYmplY3QudG90YWxFeFZhdDtcbiAgICAgICAgaW5zdGFuY2UuX3RvdGFsRXhWYXRGb3JtYXR0ZWQgPSBqc29uT2JqZWN0LnRvdGFsRXhWYXRGb3JtYXR0ZWQ7XG4gICAgICAgIGluc3RhbmNlLl92YXRUb3RhbCA9IGpzb25PYmplY3QudmF0VG90YWw7XG4gICAgICAgIGluc3RhbmNlLl92YXRUb3RhbEZvcm1hdHRlZCA9IGpzb25PYmplY3QudmF0VG90YWxGb3JtYXR0ZWQ7XG4gICAgICAgIGluc3RhbmNlLl9zaGlwcGluZ0Nvc3RzID0ganNvbk9iamVjdC5zaGlwcGluZ0Nvc3RzO1xuICAgICAgICBpbnN0YW5jZS5fc2hpcHBpbmdDb3N0c0Zvcm1hdHRlZCA9IGpzb25PYmplY3Quc2hpcHBpbmdDb3N0c0Zvcm1hdHRlZDtcbiAgICAgICAgaW5zdGFuY2UuX3RvdGFsID0ganNvbk9iamVjdC50b3RhbDtcbiAgICAgICAgaW5zdGFuY2UuX3RvdGFsRm9ybWF0dGVkID0ganNvbk9iamVjdC50b3RhbEZvcm1hdHRlZDtcbiAgICAgICAgaW5zdGFuY2UuX3ZhdFBlcmNlbnRhZ2UgPSBqc29uT2JqZWN0LnZhdFBlcmNlbnRhZ2U7XG4gICAgICAgIGluc3RhbmNlLl9jb3Vwb25Db2RlcyA9IGpzb25PYmplY3QuY291cG9uQ29kZXM7XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiBqc29uIHN0cmluZyByZXByZXNlbnRzIGEgQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ganNvblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbG9nRXJyb3JzXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgaXMoanNvbiwgbG9nRXJyb3JzID0gdHJ1ZSlcbiAgICB7XG4gICAgICAgIGxldCBqc29uT2JqZWN0ID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGpzb25PYmplY3QgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgICAgICAgICAgaWYoIWpzb25PYmplY3QpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYobG9nRXJyb3JzKSBjb25zb2xlLmVycm9yKCdDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2U6IFRoZSBnaXZlbiBqc29uIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIENoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZSBzaW5jZSB0aGUganNvbiBzdHJpbmcgd2FzIG5vdCBhIHZhbGlkIGpzb24nKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCd0b3RhbEV4VmF0Rm9ybWF0dGVkJykgfHwgdHlwZW9mIGpzb25PYmplY3QudG90YWxFeFZhdEZvcm1hdHRlZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlOiBUaGUgcmVzcG9uc2Ugb2JqZWN0IG11c3QgaGF2ZSBhIHRvdGFsRXhWYXRGb3JtYXR0ZWQgcHJvcGVydHkgdGhhdCBpcyBhIHN0cmluZy4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZighanNvbk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgndG90YWxFeFZhdEFuZERpc2NvdW50c0Zvcm1hdHRlZCcpIHx8IHR5cGVvZiBqc29uT2JqZWN0LnRvdGFsRXhWYXRBbmREaXNjb3VudHNGb3JtYXR0ZWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZihsb2dFcnJvcnMpIGNvbnNvbGUuZXJyb3IoJ0NoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZTogVGhlIHJlc3BvbnNlIG9iamVjdCBtdXN0IGhhdmUgYSB0b3RhbEV4VmF0QW5kRGlzY291bnRzRm9ybWF0dGVkIHByb3BlcnR5IHRoYXQgaXMgYSBzdHJpbmcuIE9iamVjdDogJywganNvbk9iamVjdCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgfVxuICAgICAgICBpZighanNvbk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgndmF0VG90YWxGb3JtYXR0ZWQnKSB8fCB0eXBlb2YganNvbk9iamVjdC52YXRUb3RhbEZvcm1hdHRlZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlOiBUaGUgcmVzcG9uc2Ugb2JqZWN0IG11c3QgaGF2ZSBhIHZhdFRvdGFsRm9ybWF0dGVkIHByb3BlcnR5IHRoYXQgaXMgYSBzdHJpbmcuIE9iamVjdDogJywganNvbk9iamVjdCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgfVxuICAgICAgICBpZighanNvbk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnc2hpcHBpbmdDb3N0c0Zvcm1hdHRlZCcpIHx8IHR5cGVvZiBqc29uT2JqZWN0LnNoaXBwaW5nQ29zdHNGb3JtYXR0ZWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZihsb2dFcnJvcnMpIGNvbnNvbGUuZXJyb3IoJ0NoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZTogVGhlIHJlc3BvbnNlIG9iamVjdCBtdXN0IGhhdmUgYSBzaGlwcGluZ0Nvc3RzRm9ybWF0dGVkIHByb3BlcnR5IHRoYXQgaXMgYSBzdHJpbmcuIE9iamVjdDogJywganNvbk9iamVjdCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgfVxuICAgICAgICBpZighanNvbk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgndG90YWxGb3JtYXR0ZWQnKSB8fCB0eXBlb2YganNvbk9iamVjdC50b3RhbEZvcm1hdHRlZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlOiBUaGUgcmVzcG9uc2Ugb2JqZWN0IG11c3QgaGF2ZSBhIHRvdGFsRm9ybWF0dGVkIHByb3BlcnR5IHRoYXQgaXMgYSBzdHJpbmcuIE9iamVjdDogJywganNvbk9iamVjdCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCd0b3RhbEV4VmF0QW5kRGlzY291bnRzJykgfHwgdHlwZW9mIGpzb25PYmplY3QudG90YWxFeFZhdEFuZERpc2NvdW50cyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlOiBUaGUgcmVzcG9uc2Ugb2JqZWN0IG11c3QgaGF2ZSBhIHRvdGFsRXhWYXRBbmREaXNjb3VudHMgcHJvcGVydHkgdGhhdCBpcyBhIG51bWJlci4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICB9XG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCd0b3RhbEV4VmF0JykgfHwgdHlwZW9mIGpzb25PYmplY3QudG90YWxFeFZhdCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlOiBUaGUgcmVzcG9uc2Ugb2JqZWN0IG11c3QgaGF2ZSBhIHRvdGFsRXhWYXQgcHJvcGVydHkgdGhhdCBpcyBhIG51bWJlci4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICB9XG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCd2YXRUb3RhbCcpIHx8IHR5cGVvZiBqc29uT2JqZWN0LnZhdFRvdGFsICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaWYobG9nRXJyb3JzKSBjb25zb2xlLmVycm9yKCdDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2U6IFRoZSByZXNwb25zZSBvYmplY3QgbXVzdCBoYXZlIGEgdmF0VG90YWwgcHJvcGVydHkgdGhhdCBpcyBhIG51bWJlci4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICB9XG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCdzaGlwcGluZ0Nvc3RzJykgfHwgdHlwZW9mIGpzb25PYmplY3Quc2hpcHBpbmdDb3N0cyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlOiBUaGUgcmVzcG9uc2Ugb2JqZWN0IG11c3QgaGF2ZSBhIHNoaXBwaW5nQ29zdHMgcHJvcGVydHkgdGhhdCBpcyBhIG51bWJlci4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICB9XG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCd0b3RhbCcpIHx8IHR5cGVvZiBqc29uT2JqZWN0LnRvdGFsICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaWYobG9nRXJyb3JzKSBjb25zb2xlLmVycm9yKCdDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2U6IFRoZSByZXNwb25zZSBvYmplY3QgbXVzdCBoYXZlIGEgdG90YWwgcHJvcGVydHkgdGhhdCBpcyBhIG51bWJlci4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICB9XG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCd2YXRQZXJjZW50YWdlJykgfHwgdHlwZW9mIGpzb25PYmplY3QudmF0UGVyY2VudGFnZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlOiBUaGUgcmVzcG9uc2Ugb2JqZWN0IG11c3QgaGF2ZSBhIHZhdFBlcmNlbnRhZ2UgcHJvcGVydHkgdGhhdCBpcyBhIG51bWJlci4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICB9XG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCdjb3Vwb25Db2RlcycpIHx8ICFBcnJheS5pc0FycmF5KGpzb25PYmplY3QuY291cG9uQ29kZXMpKSB7XG4gICAgICAgICAgICBpZihsb2dFcnJvcnMpIGNvbnNvbGUuZXJyb3IoJ0NoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZTogVGhlIHJlc3BvbnNlIG9iamVjdCBtdXN0IGhhdmUgYSBjb3Vwb25Db2RlcyBwcm9wZXJ0eSB0aGF0IGlzIGFuIGFycmF5LiBPYmplY3Q6ICcsIGpzb25PYmplY3QpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuICAgIGdldCB0b3RhbEV4VmF0QW5kRGlzY291bnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxFeFZhdEFuZERpc2NvdW50cztcbiAgICB9XG5cbiAgICBnZXQgdG90YWxFeFZhdEFuZERpc2NvdW50c0Zvcm1hdHRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsRXhWYXRBbmREaXNjb3VudHNGb3JtYXR0ZWQ7XG4gICAgfVxuXG4gICAgZ2V0IHRvdGFsRXhWYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90b3RhbEV4VmF0O1xuICAgIH1cblxuICAgIGdldCB0b3RhbEV4VmF0Rm9ybWF0dGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxFeFZhdEZvcm1hdHRlZDtcbiAgICB9XG5cbiAgICBnZXQgdmF0VG90YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YXRUb3RhbDtcbiAgICB9XG5cbiAgICBnZXQgdmF0VG90YWxGb3JtYXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YXRUb3RhbEZvcm1hdHRlZDtcbiAgICB9XG5cbiAgICBnZXQgc2hpcHBpbmdDb3N0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NoaXBwaW5nQ29zdHM7XG4gICAgfVxuXG4gICAgZ2V0IHNoaXBwaW5nQ29zdHNGb3JtYXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaGlwcGluZ0Nvc3RzRm9ybWF0dGVkO1xuICAgIH1cblxuICAgIGdldCB0b3RhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsO1xuICAgIH1cblxuICAgIGdldCB0b3RhbEZvcm1hdHRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsRm9ybWF0dGVkO1xuICAgIH1cblxuICAgIGdldCB2YXRQZXJjZW50YWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmF0UGVyY2VudGFnZTtcbiAgICB9XG5cbiAgICBnZXQgY291cG9uQ29kZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3Vwb25Db2RlcztcbiAgICB9XG59XG5cbmV4cG9ydCB7IENoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZSB9IiwiLyoqXG4gKiBDb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UuXG4gKlxuICogUmVwcmVzZW50cyBhIHJlc3BvbnNlIHRoYXQgb3JpZ2luYXRlcyBmcm9tXG4gKi9cbmltcG9ydCB7IExhbmd1YWdlIH0gZnJvbSBcIi4vbGFuZ3VhZ2VcIjtcblxuY2xhc3MgQ291bnRyeUxhbmd1YWdlc1Jlc3BvbnNlIHtcbiAgICBjb25zdHJ1Y3RvcigpXG4gICAge1xuICAgICAgICB0aGlzLl9sYW5ndWFnZXMgPSBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ganNvblxuICAgICAqIEByZXR1cm4ge0NvdW50cnlMYW5ndWFnZXNSZXNwb25zZXxudWxsfVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tSnNvblN0cmluZyhqc29uKSB7XG4gICAgICAgIGlmKCF0aGlzLmlzKGpzb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQganNvbk9iamVjdCA9IEpTT04ucGFyc2UoanNvbik7XG5cbiAgICAgICAgbGV0IGluc3RhbmNlID0gbmV3IHRoaXM7XG4gICAgICAgIGxldCBsYW5ndWFnZUNvdW50ID0ganNvbk9iamVjdC5sYW5ndWFnZXMubGVuZ3RoO1xuICAgICAgICBmb3IobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsYW5ndWFnZUNvdW50OyBpbmRleCsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgbGFuZ3VhZ2VPYmplY3QgPSBqc29uT2JqZWN0Lmxhbmd1YWdlc1tpbmRleF07XG4gICAgICAgICAgICBsZXQgbGFuZ3VhZ2UgPSBuZXcgTGFuZ3VhZ2UoKTtcbiAgICAgICAgICAgIGxhbmd1YWdlLm5hbWUgPSBsYW5ndWFnZU9iamVjdC5uYW1lO1xuICAgICAgICAgICAgbGFuZ3VhZ2UuZGlzcGxheU5hbWUgPSBsYW5ndWFnZU9iamVjdC5kaXNwbGF5TmFtZTtcbiAgICAgICAgICAgIGxhbmd1YWdlLm5hdGl2ZU5hbWUgPSBsYW5ndWFnZU9iamVjdC5uYXRpdmVOYW1lO1xuICAgICAgICAgICAgbGFuZ3VhZ2UudHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lID0gbGFuZ3VhZ2VPYmplY3QudHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lO1xuICAgICAgICAgICAgbGFuZ3VhZ2UudGhyZWVMZXR0ZXJJc29MYW5ndWFnZU5hbWUgPSBsYW5ndWFnZU9iamVjdC50aHJlZUxldHRlcklzb0xhbmd1YWdlTmFtZTtcblxuICAgICAgICAgICAgaW5zdGFuY2UuX2xhbmd1YWdlcy5wdXNoKGxhbmd1YWdlKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiBqc29uIHN0cmluZyByZXByZXNlbnRzIGEgRXJyb3JSZXNwb25zZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGpzb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGxvZ0Vycm9yc1xuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGlzKGpzb24sIGxvZ0Vycm9ycyA9IHRydWUpXG4gICAge1xuICAgICAgICBsZXQganNvbk9iamVjdCA9IG51bGw7XG5cbiAgICAgICAgaWYodHlwZW9mIGpzb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGpzb25PYmplY3QgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgICAgICAgICAgICAgIGlmICghanNvbk9iamVjdCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdW50cnlMYW5ndWFnZXNSZXNwb25zZTogVGhlIGdpdmVuIGpzb24gZG9lcyBub3QgcmVwcmVzZW50IGEgQ291bnRyeUxhbmd1YWdlc1Jlc3BvbnNlIHNpbmNlIHRoZSBqc29uIHN0cmluZyB3YXMgbm90IGEgdmFsaWQganNvbi4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBqc29uT2JqZWN0ID0ganNvblxuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWpzb25PYmplY3QuaGFzT3duUHJvcGVydHkoJ2xhbmd1YWdlcycpIHx8ICFBcnJheS5pc0FycmF5KGpzb25PYmplY3QubGFuZ3VhZ2VzKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdW50cnlMYW5ndWFnZXNSZXNwb25zZTogVGhlIGdpdmVuIGpzb24gbXVzdCBoYXZlIGEgcHJvcGVydHkgY2FsbGVkIGxhbmd1YWdlcyB0aGF0IGlzIGFuIEFycmF5LCBCdXQgZGlkIG5vdCBoYXZlLiBPYmplY3Q6ICcsIGpzb25PYmplY3QpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxhbmd1YWdlQ291bnQgPSBqc29uT2JqZWN0Lmxhbmd1YWdlcy5sZW5ndGg7XG4gICAgICAgIGZvcihsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxhbmd1YWdlQ291bnQ7IGluZGV4KyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBsYW5ndWFnZU9iamVjdCA9IGpzb25PYmplY3QubGFuZ3VhZ2VzW2luZGV4XTtcbiAgICAgICAgICAgIGlmKHR5cGVvZiBsYW5ndWFnZU9iamVjdCAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIGxhbmd1YWdlT2JqZWN0ID09PSAnZnVuY3Rpb24nIHx8ICFMYW5ndWFnZS5pcyhsYW5ndWFnZU9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge3t2YWxpZDogYm9vbGVhbiwgZXJyb3JzOiBBcnJheX19XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdG9Kc29uKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2xhbmd1YWdlcyc6IHRoaXMuX2xhbmd1YWdlc1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TGFuZ3VhZ2VbXX1cbiAgICAgKi9cbiAgICBnZXQgbGFuZ3VhZ2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VzO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgQ291bnRyeUxhbmd1YWdlc1Jlc3BvbnNlIH0iLCIvKipcbiAqIEEgbGFyYXZlbCBlcnJvciByZXNwb25zZVxuICovXG5jbGFzcyBFcnJvclJlc3BvbnNlIHtcbiAgICBjb25zdHJ1Y3RvcigpXG4gICAge1xuICAgICAgICB0aGlzLl9tZXNzYWdlID0gJyc7XG4gICAgICAgIHRoaXMuX2Vycm9ycyA9IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBqc29uXG4gICAgICogQHJldHVybiB7RXJyb3JSZXNwb25zZXxudWxsfVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tSnNvblN0cmluZyhqc29uKSB7XG4gICAgICAgIGlmKCF0aGlzLmlzKGpzb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQganNvbk9iamVjdCA9IEpTT04ucGFyc2UoanNvbik7XG5cbiAgICAgICAgbGV0IGluc3RhbmNlID0gbmV3IHRoaXM7XG4gICAgICAgIGluc3RhbmNlLl9tZXNzYWdlID0ganNvbk9iamVjdC5tZXNzYWdlO1xuICAgICAgICBpbnN0YW5jZS5fZXJyb3JzID0ganNvbk9iamVjdC5lcnJvcnM7XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiBqc29uIHN0cmluZyByZXByZXNlbnRzIGEgRXJyb3JSZXNwb25zZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGpzb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGxvZ0Vycm9yc1xuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGlzKGpzb24sIGxvZ0Vycm9ycyA9IHRydWUpXG4gICAge1xuICAgICAgICBsZXQganNvbk9iamVjdCA9IG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBqc29uT2JqZWN0ID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgICAgICAgIGlmKCFqc29uT2JqZWN0KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignRXJyb3JSZXNwb25zZTogVGhlIGdpdmVuIGpzb24gZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQgRXJyb3JSZXNwb25zZSBzaW5jZSB0aGUganNvbiBzdHJpbmcgd2FzIG5vdCBhIHZhbGlkIGpzb24nKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCdtZXNzYWdlJykgfHwgdHlwZW9mIGpzb25PYmplY3QubWVzc2FnZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignRXJyb3JSZXNwb25zZTogVGhlIHJlc3BvbnNlIG9iamVjdCBtdXN0IGhhdmUgYW4gbWVzc2FnZSBwcm9wZXJ0eSB0aGF0IGlzIGEgc3RyaW5nLiBPYmplY3Q6JywganNvbk9iamVjdCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZighanNvbk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnZXJyb3JzJykgfHwgdHlwZW9mIGpzb25PYmplY3QuZXJyb3JzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYobG9nRXJyb3JzKSBjb25zb2xlLmVycm9yKCdFcnJvclJlc3BvbnNlOiBUaGUgcmVzcG9uc2Ugb2JqZWN0IG11c3QgaGF2ZSBhbiBlcnJvcnMgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB2YWxpZCBsYXJhdmVsIGZpZWxkIGVycm9ycy4gT2JqZWN0OicsIGpzb25PYmplY3QpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yKGxldCBmaWVsZE5hbWUgaW4ganNvbk9iamVjdC5lcnJvcnMpIHtcbiAgICAgICAgICAgIGlmKGpzb25PYmplY3QuZXJyb3JzLmhhc093blByb3BlcnR5KGZpZWxkTmFtZSkgJiYgIUFycmF5LmlzQXJyYXkoanNvbk9iamVjdC5lcnJvcnNbZmllbGROYW1lXSkpIHtcbiAgICAgICAgICAgICAgICBpZihsb2dFcnJvcnMpIGNvbnNvbGUuZXJyb3IoJ0Vycm9yUmVzcG9uc2U6IFRoZSBwcm9wZXJ0eSBcIicrZmllbGROYW1lKydcIiBpbiB0aGUgZXJyb3JzIGFycmF5IG11c3QgaGF2ZSBoYXZlIGFycmF5IGFzIHZhbHVlIGNvbnRhaW5pbmcgZXJyb3JzIHN0cmluZ3MuIE9iamVjdDonLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRydXJucyBhIGNvbXByZWhlbnNpdmUgZXJyb3IgbWVzc2FnZSBmb3IgYWxsIHRoZSBmaWVsZHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gcmV0dXJucyBhbiBvYmplY3Qgd2hlcmUgdGhlIHByb3BlcnR5IGFyZSBmaWVsZCBuYW1lcy4gYW5kIHRoZSB2YWx1ZXMgYXJlIGFycmF5cyBjb250YWluaW5nIGVycm9ycyBmb3IgdGhvc2UgZmllbGQgbmFtZXMuXG4gICAgICovXG4gICAgZ2V0IGVycm9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9ycztcbiAgICB9XG59XG5cbmV4cG9ydCB7IEVycm9yUmVzcG9uc2UgfSIsIi8qKlxuICogTGFuZ3VhZ2UuXG4gKlxuICogUmVwcmVzZW50cyBhIExhbmd1YWdlXG4gKi9cbmNsYXNzIExhbmd1YWdlIHtcbiAgICBjb25zdHJ1Y3RvcigpXG4gICAge1xuICAgICAgICB0aGlzLl9uYW1lID0gJyc7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXlOYW1lID0gJyc7XG4gICAgICAgIHRoaXMuX25hdGl2ZU5hbWUgPSAnJztcbiAgICAgICAgdGhpcy5fdHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lID0gJyc7XG4gICAgICAgIHRoaXMuX3RocmVlTGV0dGVySXNvTGFuZ3VhZ2VOYW1lID0gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGpzb25cbiAgICAgKiBAcmV0dXJuIHtMYW5ndWFnZXxudWxsfVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tSnNvblN0cmluZyhqc29uKSB7XG4gICAgICAgIGlmKCF0aGlzLmlzKGpzb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQganNvbk9iamVjdCA9IEpTT04ucGFyc2UoanNvbik7XG5cbiAgICAgICAgbGV0IGluc3RhbmNlID0gbmV3IHRoaXM7XG4gICAgICAgIGluc3RhbmNlLl9uYW1lID0ganNvbk9iamVjdC5uYW1lO1xuICAgICAgICBpbnN0YW5jZS5fZGlzcGxheU5hbWUgPSBqc29uT2JqZWN0LmRpc3BsYXlOYW1lO1xuICAgICAgICBpbnN0YW5jZS5fbmF0aXZlTmFtZSA9IGpzb25PYmplY3QubmF0aXZlTmFtZTtcbiAgICAgICAgaW5zdGFuY2UuX3R3b0xldHRlcklzb0xhbmd1YWdlTmFtZSA9IGpzb25PYmplY3QudHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lO1xuICAgICAgICBpbnN0YW5jZS5fdGhyZWVMZXR0ZXJJc29MYW5ndWFnZU5hbWUgPSBqc29uT2JqZWN0LnRocmVlTGV0dGVySXNvTGFuZ3VhZ2VOYW1lO1xuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4ganNvbiBzdHJpbmcgcmVwcmVzZW50cyBhIEVycm9yUmVzcG9uc2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0ganNvblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbG9nRXJyb3JzXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgaXMoanNvbiwgbG9nRXJyb3JzID0gdHJ1ZSlcbiAgICB7XG4gICAgICAgIGxldCBqc29uT2JqZWN0ID0gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGlmKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBqc29uT2JqZWN0ID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgICAgICAgICAgICBpZiAoIWpzb25PYmplY3QpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdMYW5ndWFnZTogVGhlIGdpdmVuIGpzb24gZG9lcyBub3QgcmVwcmVzZW50IGEgTGFuZ3VhZ2Ugc2luY2UgdGhlIGpzb24gc3RyaW5nIHdhcyBub3QgYSB2YWxpZCBqc29uLiBPYmplY3Q6ICcsIGpzb25PYmplY3QsIGpzb24pO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGpzb25PYmplY3QgPSBqc29uXG4gICAgICAgIH1cblxuICAgICAgICBpZighanNvbk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpIHx8IHR5cGVvZiBqc29uT2JqZWN0LmRpc3BsYXlOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYobG9nRXJyb3JzKSBjb25zb2xlLmVycm9yKCdMYW5ndWFnZTogVGhlIGxhbmd1YWdlIG9iamVjdCBtdXN0IGhhdmUgYSBwcm9wZXJ0eSBjYWxsZWQgbmFtZSB0aGF0IGlzIGEgc3RyaW5nLiBPYmplY3Q6ICcsIGpzb25PYmplY3QpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCdkaXNwbGF5TmFtZScpIHx8IHR5cGVvZiBqc29uT2JqZWN0LmRpc3BsYXlOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYobG9nRXJyb3JzKSBjb25zb2xlLmVycm9yKCdMYW5ndWFnZTogVGhlIGxhbmd1YWdlIG9iamVjdCBtdXN0IGhhdmUgYSBwcm9wZXJ0eSBjYWxsZWQgZGlzcGxheU5hbWUgdGhhdCBpcyBhIHN0cmluZy4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZighanNvbk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnbmF0aXZlTmFtZScpIHx8IHR5cGVvZiBqc29uT2JqZWN0Lm5hdGl2ZU5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZihsb2dFcnJvcnMpIGNvbnNvbGUuZXJyb3IoJ0xhbmd1YWdlOiBUaGUgbGFuZ3VhZ2Ugb2JqZWN0IG11c3QgaGF2ZSBhIHByb3BlcnR5IGNhbGxlZCBuYXRpdmVOYW1lIHRoYXQgaXMgYSBzdHJpbmcuIE9iamVjdDogJywganNvbk9iamVjdCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoIWpzb25PYmplY3QuaGFzT3duUHJvcGVydHkoJ3R3b0xldHRlcklzb0xhbmd1YWdlTmFtZScpIHx8IHR5cGVvZiBqc29uT2JqZWN0LnR3b0xldHRlcklzb0xhbmd1YWdlTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignTGFuZ3VhZ2U6IFRoZSBsYW5ndWFnZSBvYmplY3QgbXVzdCBoYXZlIGEgcHJvcGVydHkgY2FsbGVkIHR3b0xldHRlcklzb0xhbmd1YWdlTmFtZSB0aGF0IGlzIGEgc3RyaW5nLiBPYmplY3Q6ICcsIGpzb25PYmplY3QudHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZighanNvbk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgndGhyZWVMZXR0ZXJJc29MYW5ndWFnZU5hbWUnKSB8fCB0eXBlb2YganNvbk9iamVjdC50aHJlZUxldHRlcklzb0xhbmd1YWdlTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignTGFuZ3VhZ2U6IFRoZSBsYW5ndWFnZSBvYmplY3QgbXVzdCBoYXZlIGEgcHJvcGVydHkgY2FsbGVkIHRocmVlTGV0dGVySXNvTGFuZ3VhZ2VOYW1lIHRoYXQgaXMgYSBzdHJpbmcuIE9iamVjdDogJywganNvbk9iamVjdCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge3t2YWxpZDogYm9vbGVhbiwgZXJyb3JzOiBBcnJheX19XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdG9Kc29uKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ25hbWUnOiB0aGlzLl9uYW1lLFxuICAgICAgICAgICAgJ2Rpc3BsYXlOYW1lJzogdGhpcy5fZGlzcGxheU5hbWUsXG4gICAgICAgICAgICAnbmF0aXZlTmFtZSc6IHRoaXMuX25hdGl2ZU5hbWUsXG4gICAgICAgICAgICAndHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lJzogdGhpcy5fdHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lLFxuICAgICAgICAgICAgJ3RocmVlTGV0dGVySXNvTGFuZ3VhZ2VOYW1lJzogdGhpcy5fdGhyZWVMZXR0ZXJJc29MYW5ndWFnZU5hbWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgICB9XG5cbiAgICBzZXQgbmFtZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9uYW1lID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IGRpc3BsYXlOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzcGxheU5hbWU7XG4gICAgfVxuXG4gICAgc2V0IGRpc3BsYXlOYW1lKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXlOYW1lID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IG5hdGl2ZU5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uYXRpdmVOYW1lO1xuICAgIH1cblxuICAgIHNldCBuYXRpdmVOYW1lKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX25hdGl2ZU5hbWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgdHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lO1xuICAgIH1cblxuICAgIHNldCB0d29MZXR0ZXJJc29MYW5ndWFnZU5hbWUodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IHRocmVlTGV0dGVySXNvTGFuZ3VhZ2VOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGhyZWVMZXR0ZXJJc29MYW5ndWFnZU5hbWU7XG4gICAgfVxuXG4gICAgc2V0IHRocmVlTGV0dGVySXNvTGFuZ3VhZ2VOYW1lKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3RocmVlTGV0dGVySXNvTGFuZ3VhZ2VOYW1lID0gdmFsdWU7XG4gICAgfVxufVxuXG5leHBvcnQgeyBMYW5ndWFnZSB9IiwiLyoqXG4gKiBWYWxpZGF0aW9uUmVzcG9uc2UuXG4gKlxuICogUmVwcmVzZW50cyBhIHJlc3BvbnNlIHRoYXQgb3JpZ2luYXRlcyBmcm9tXG4gKi9cbmNsYXNzIFZhbGlkYXRpb25SZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IoKVxuICAgIHtcbiAgICAgICAgdGhpcy5fdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZXJyb3JzID0gW107XG4gICAgICAgIHRoaXMudG9KU09OID0gdGhpcy5fdG9Kc29uLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGpzb25cbiAgICAgKiBAcmV0dXJuIHtWYWxpZGF0aW9uUmVzcG9uc2V8bnVsbH1cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUpzb25TdHJpbmcoanNvbikge1xuICAgICAgICBpZighdGhpcy5pcyhqc29uKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGpzb25PYmplY3QgPSBKU09OLnBhcnNlKGpzb24pO1xuXG4gICAgICAgIGxldCBpbnN0YW5jZSA9IG5ldyB0aGlzO1xuICAgICAgICBpbnN0YW5jZS5fdmFsaWQgPSBqc29uT2JqZWN0LnZhbGlkO1xuICAgICAgICBpbnN0YW5jZS5fZXJyb3JzID0ganNvbk9iamVjdC5lcnJvcnM7XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiBqc29uIHN0cmluZyByZXByZXNlbnRzIGEgRXJyb3JSZXNwb25zZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGpzb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGxvZ0Vycm9yc1xuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGlzKGpzb24sIGxvZ0Vycm9ycyA9IHRydWUpXG4gICAge1xuICAgICAgICBsZXQganNvbk9iamVjdCA9IG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBqc29uT2JqZWN0ID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgICAgICAgIGlmKCFqc29uT2JqZWN0KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1ZhbGlkYXRpb25SZXNwb25zZTogVGhlIGdpdmVuIGpzb24gZG9lcyBub3QgcmVwcmVzZW50IGEgVmFsaWRhdGlvblJlc3BvbnNlIHNpbmNlIHRoZSBqc29uIHN0cmluZyB3YXMgbm90IGEgdmFsaWQganNvbi4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCd2YWxpZCcpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdWYWxpZGF0aW9uUmVzcG9uc2U6IFRoZSBnaXZlbiBqc29uIG9iamVjdCBtdXN0IGhhdmUgYW4gXCJ2YWxpZFwiIHByb3BlcnR5IHRoYXQgaXMgYSBzdHJpbmcuIEJ1dCBkaWQgbm90IGhhdmUgb25lLiBPYmplY3Q6ICcsIGpzb25PYmplY3QpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWpzb25PYmplY3QuaGFzT3duUHJvcGVydHkoJ2Vycm9ycycpIHx8IHR5cGVvZiAhanNvbk9iamVjdC5lcnJvcnMgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1ZhbGlkYXRpb25SZXNwb25zZTogVGhlIGdpdmVuIGpzb24gb2JqZWN0IG11c3QgaGF2ZSBhbiBlcnJvcnMgb2JqZWN0LiBCdXQgZGlkIG5vdCBoYXZlIG9uZS4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7e3ZhbGlkOiBib29sZWFuLCBlcnJvcnM6IEFycmF5fX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF90b0pzb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAndmFsaWQnOiB0aGlzLl92YWxpZCxcbiAgICAgICAgICAgICdlcnJvcnMnOiB0aGlzLl9lcnJvcnNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0IHZhbGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7QXJyYXl9XG4gICAgICovXG4gICAgZ2V0IGVycm9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9ycztcbiAgICB9XG59XG5cbmV4cG9ydCB7IFZhbGlkYXRpb25SZXNwb25zZSB9IiwiLyoqXG4gKiBFdmVudCBzZW1pIHBvbHlmaWxsLiBJRSBkb2VzIG5vdCBzdXBwb3J0IG5ldyBldmVudC4gQnV0IGRvZXMgc3VwcG9ydCBkb2N1bWVudC5jcmVhdGVFdmVudC5cbiAqIFNhbWUgdGhpbmcgZm9yIGRpc3BhdGNoaW5nIGV2ZW50cy4gQnV0IHRoZW4gd2l0aCBjcmVhdGVFdmVudCBhbmQgZmlyZUV2ZW50LlxuICovXG5cblxuZnVuY3Rpb24gY3JlYXRlTmV3RXZlbnQoZXZlbnROYW1lKSB7XG4gICAgbGV0IGV2ZW50O1xuICAgIGlmICh0eXBlb2YoRXZlbnQpID09PSAnZnVuY3Rpb24nKSB7IC8vT24gaWUgaXQgaXMgdHlwZU9mIG9iamVjdC5cbiAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoZXZlbnROYW1lKTsgLy9Ob24taWVcbiAgICB9IGVsc2Uge1xuICAgICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpOyAvL2llXG4gICAgICAgIGV2ZW50LmluaXRFdmVudChldmVudE5hbWUsIHRydWUsIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnQ7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRGb3JFbGVtZW50KGVsZW1lbnQsIGV2ZW50KVxue1xuICAgIGlmIChkb2N1bWVudC5jcmVhdGVFdmVudCkge1xuICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuZmlyZUV2ZW50KFwib25cIiArIGV2ZW50LmV2ZW50VHlwZSwgZXZlbnQpO1xuICAgIH1cbn1cblxuIiwiTnVtYmVyLmlzSW50ZWdlciA9IE51bWJlci5pc0ludGVnZXIgfHwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmXG4gICAgICAgIGlzRmluaXRlKHZhbHVlKSAmJlxuICAgICAgICBNYXRoLmZsb29yKHZhbHVlKSA9PT0gdmFsdWU7XG59OyIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeSgpIDpcbiAgICAgICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgICAgICAgICAgIChmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvKipcbiAgICAgKiBAdGhpcyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5hbGx5Q29uc3RydWN0b3IoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGNvbnN0cnVjdG9yID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgICAgICAgIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLnJlc29sdmUoY2FsbGJhY2soKSkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5yZXNvbHZlKGNhbGxiYWNrKCkpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5yZWplY3QocmVhc29uKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbi8vIFN0b3JlIHNldFRpbWVvdXQgcmVmZXJlbmNlIHNvIHByb21pc2UtcG9seWZpbGwgd2lsbCBiZSB1bmFmZmVjdGVkIGJ5XG4vLyBvdGhlciBjb2RlIG1vZGlmeWluZyBzZXRUaW1lb3V0IChsaWtlIHNpbm9uLnVzZUZha2VUaW1lcnMoKSlcbiAgICB2YXIgc2V0VGltZW91dEZ1bmMgPSBzZXRUaW1lb3V0O1xuXG4gICAgZnVuY3Rpb24gbm9vcCgpIHt9XG5cbi8vIFBvbHlmaWxsIGZvciBGdW5jdGlvbi5wcm90b3R5cGUuYmluZFxuICAgIGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZm4uYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFByb21pc2UoZm4pIHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFByb21pc2UpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUHJvbWlzZXMgbXVzdCBiZSBjb25zdHJ1Y3RlZCB2aWEgbmV3Jyk7XG4gICAgICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ25vdCBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIC8qKiBAdHlwZSB7IW51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5fc3RhdGUgPSAwO1xuICAgICAgICAvKiogQHR5cGUgeyFib29sZWFufSAqL1xuICAgICAgICB0aGlzLl9oYW5kbGVkID0gZmFsc2U7XG4gICAgICAgIC8qKiBAdHlwZSB7UHJvbWlzZXx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHR5cGUgeyFBcnJheTwhRnVuY3Rpb24+fSAqL1xuICAgICAgICB0aGlzLl9kZWZlcnJlZHMgPSBbXTtcblxuICAgICAgICBkb1Jlc29sdmUoZm4sIHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZShzZWxmLCBkZWZlcnJlZCkge1xuICAgICAgICB3aGlsZSAoc2VsZi5fc3RhdGUgPT09IDMpIHtcbiAgICAgICAgICAgIHNlbGYgPSBzZWxmLl92YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZi5fc3RhdGUgPT09IDApIHtcbiAgICAgICAgICAgIHNlbGYuX2RlZmVycmVkcy5wdXNoKGRlZmVycmVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZWxmLl9oYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgUHJvbWlzZS5faW1tZWRpYXRlRm4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgY2IgPSBzZWxmLl9zdGF0ZSA9PT0gMSA/IGRlZmVycmVkLm9uRnVsZmlsbGVkIDogZGVmZXJyZWQub25SZWplY3RlZDtcbiAgICAgICAgICAgIGlmIChjYiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIChzZWxmLl9zdGF0ZSA9PT0gMSA/IHJlc29sdmUgOiByZWplY3QpKGRlZmVycmVkLnByb21pc2UsIHNlbGYuX3ZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmV0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQgPSBjYihzZWxmLl92YWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGRlZmVycmVkLnByb21pc2UsIGUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUoZGVmZXJyZWQucHJvbWlzZSwgcmV0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZShzZWxmLCBuZXdWYWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gUHJvbWlzZSBSZXNvbHV0aW9uIFByb2NlZHVyZTogaHR0cHM6Ly9naXRodWIuY29tL3Byb21pc2VzLWFwbHVzL3Byb21pc2VzLXNwZWMjdGhlLXByb21pc2UtcmVzb2x1dGlvbi1wcm9jZWR1cmVcbiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gc2VsZilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLicpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG5ld1ZhbHVlID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoZW4gPSBuZXdWYWx1ZS50aGVuO1xuICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSAzO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmaW5hbGUoc2VsZik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvUmVzb2x2ZShiaW5kKHRoZW4sIG5ld1ZhbHVlKSwgc2VsZik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IDE7XG4gICAgICAgICAgICBzZWxmLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgZmluYWxlKHNlbGYpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZWplY3Qoc2VsZiwgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWplY3Qoc2VsZiwgbmV3VmFsdWUpIHtcbiAgICAgICAgc2VsZi5fc3RhdGUgPSAyO1xuICAgICAgICBzZWxmLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICBmaW5hbGUoc2VsZik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmluYWxlKHNlbGYpIHtcbiAgICAgICAgaWYgKHNlbGYuX3N0YXRlID09PSAyICYmIHNlbGYuX2RlZmVycmVkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIFByb21pc2UuX2ltbWVkaWF0ZUZuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmICghc2VsZi5faGFuZGxlZCkge1xuICAgICAgICAgICAgICAgICAgICBQcm9taXNlLl91bmhhbmRsZWRSZWplY3Rpb25GbihzZWxmLl92YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc2VsZi5fZGVmZXJyZWRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBoYW5kbGUoc2VsZiwgc2VsZi5fZGVmZXJyZWRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBzZWxmLl9kZWZlcnJlZHMgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb21pc2UpIHtcbiAgICAgICAgdGhpcy5vbkZ1bGZpbGxlZCA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogbnVsbDtcbiAgICAgICAgdGhpcy5vblJlamVjdGVkID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT09ICdmdW5jdGlvbicgPyBvblJlamVjdGVkIDogbnVsbDtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYWtlIGEgcG90ZW50aWFsbHkgbWlzYmVoYXZpbmcgcmVzb2x2ZXIgZnVuY3Rpb24gYW5kIG1ha2Ugc3VyZVxuICAgICAqIG9uRnVsZmlsbGVkIGFuZCBvblJlamVjdGVkIGFyZSBvbmx5IGNhbGxlZCBvbmNlLlxuICAgICAqXG4gICAgICogTWFrZXMgbm8gZ3VhcmFudGVlcyBhYm91dCBhc3luY2hyb255LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRvUmVzb2x2ZShmbiwgc2VsZikge1xuICAgICAgICB2YXIgZG9uZSA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm4oXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2VsZiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZWplY3Qoc2VsZiwgcmVhc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgcmVqZWN0KHNlbGYsIGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIFByb21pc2UucHJvdG90eXBlWydjYXRjaCddID0gZnVuY3Rpb24ob25SZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0ZWQpO1xuICAgIH07XG5cbiAgICBQcm9taXNlLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB2YXIgcHJvbSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKG5vb3ApO1xuXG4gICAgICAgIGhhbmRsZSh0aGlzLCBuZXcgSGFuZGxlcihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgcHJvbSkpO1xuICAgICAgICByZXR1cm4gcHJvbTtcbiAgICB9O1xuXG4gICAgUHJvbWlzZS5wcm90b3R5cGVbJ2ZpbmFsbHknXSA9IGZpbmFsbHlDb25zdHJ1Y3RvcjtcblxuICAgIFByb21pc2UuYWxsID0gZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGlmICghYXJyIHx8IHR5cGVvZiBhcnIubGVuZ3RoID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm9taXNlLmFsbCBhY2NlcHRzIGFuIGFycmF5Jyk7XG4gICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFycik7XG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiByZXNvbHZlKFtdKTtcbiAgICAgICAgICAgIHZhciByZW1haW5pbmcgPSBhcmdzLmxlbmd0aDtcblxuICAgICAgICAgICAgZnVuY3Rpb24gcmVzKGksIHZhbCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgJiYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGhlbiA9IHZhbC50aGVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbi5jYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKGksIHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICByZXMoaSwgYXJnc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBQcm9taXNlLnJlc29sdmUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcbiAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgUHJvbWlzZS5yZWplY3QgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICByZWplY3QodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgUHJvbWlzZS5yYWNlID0gZnVuY3Rpb24odmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXNbaV0udGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4vLyBVc2UgcG9seWZpbGwgZm9yIHNldEltbWVkaWF0ZSBmb3IgcGVyZm9ybWFuY2UgZ2FpbnNcbiAgICBQcm9taXNlLl9pbW1lZGlhdGVGbiA9XG4gICAgICAgICh0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgICAgICBmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7XG4gICAgICAgICAgICB9KSB8fFxuICAgICAgICBmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgc2V0VGltZW91dEZ1bmMoZm4sIDApO1xuICAgICAgICB9O1xuXG4gICAgUHJvbWlzZS5fdW5oYW5kbGVkUmVqZWN0aW9uRm4gPSBmdW5jdGlvbiBfdW5oYW5kbGVkUmVqZWN0aW9uRm4oZXJyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdQb3NzaWJsZSBVbmhhbmRsZWQgUHJvbWlzZSBSZWplY3Rpb246JywgZXJyKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIEBzdXBwcmVzcyB7dW5kZWZpbmVkVmFyc30gKi9cbiAgICB2YXIgZ2xvYmFsTlMgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIHRoZSBvbmx5IHJlbGlhYmxlIG1lYW5zIHRvIGdldCB0aGUgZ2xvYmFsIG9iamVjdCBpc1xuICAgICAgICAvLyBgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKWBcbiAgICAgICAgLy8gSG93ZXZlciwgdGhpcyBjYXVzZXMgQ1NQIHZpb2xhdGlvbnMgaW4gQ2hyb21lIGFwcHMuXG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWw7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmFibGUgdG8gbG9jYXRlIGdsb2JhbCBvYmplY3QnKTtcbiAgICB9KSgpO1xuXG4gICAgaWYgKCEoJ1Byb21pc2UnIGluIGdsb2JhbE5TKSkge1xuICAgICAgICBnbG9iYWxOU1snUHJvbWlzZSddID0gUHJvbWlzZTtcbiAgICB9IGVsc2UgaWYgKCFnbG9iYWxOUy5Qcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddKSB7XG4gICAgICAgIGdsb2JhbE5TLlByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10gPSBmaW5hbGx5Q29uc3RydWN0b3I7XG4gICAgfVxuXG59KSkpOyIsImltcG9ydCB7IEFkZHJlc3MgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsL21vZGVscy9hZGRyZXNzXCI7XG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbC9tb2RlbHMvZXJyb3JSZXNwb25zZVwiO1xuaW1wb3J0IHsgU2hvcHBpbmdjYXJ0U2VydmljZSB9IGZyb20gXCIuL3Nob3BwaW5nY2FydFNlcnZpY2VcIjtcbmltcG9ydCB7IENoZWNrb3V0U2VydmljZSB9IGZyb20gXCIuL2NoZWNrb3V0U2VydmljZVwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi92YWxpZGF0aW9uU2VydmljZVwiO1xuXG4vKipcbiAqIENvbnRyb2xzIHRoZSBjaGVja291dCBmb3JtXG4gKi9cbmNsYXNzIENoZWNrb3V0Q29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gY2hlY2tvdXRGb3JtRGl2RWxlbWVudFxuICAgICAqIEBwYXJhbSB7U2hvcHBpbmdjYXJ0U2VydmljZX0gc2hvcHBpbmdjYXJ0U2VydmljZVxuICAgICAqIEBwYXJhbSB7Q2hlY2tvdXRTZXJ2aWNlfSBjaGVja291dFNlcnZpY2VcbiAgICAgKiBAcGFyYW0ge1ZhbGlkYXRpb25TZXJ2aWNlfSB2YWxpZGF0aW9uU2VydmljZVxuICAgICAqIEBwYXJhbSB7R2xvYmFsaXNhdGlvblNlcnZpY2V8bnVsbH0gZ2xvYmFsaXNhdGlvblNlcnZpY2VcbiAgICAgKiBAcGFyYW0ge0Vycm9yQ29udHJvbGxlcnxudWxsfSBlcnJvckZvcm1Db250cm9sbGVyXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2hlY2tvdXRGb3JtRGl2RWxlbWVudCwgc2hvcHBpbmdjYXJ0U2VydmljZSwgY2hlY2tvdXRTZXJ2aWNlLCB2YWxpZGF0aW9uU2VydmljZSwgZ2xvYmFsaXNhdGlvblNlcnZpY2UsIGVycm9yRm9ybUNvbnRyb2xsZXIpIHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIC8vU2VsZWN0IHNvbWUgZWxlbWVudHNcbiAgICAgICAgaWYoIWNoZWNrb3V0Rm9ybURpdkVsZW1lbnQgfHwgY2hlY2tvdXRGb3JtRGl2RWxlbWVudC50YWdOYW1lICE9PSBcIkZPUk1cIikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2hlY2tvdXRDb250cm9sbGVyOiBFeHBlY3RpbmcgYSBmb3JtIGVsZW1lbnQgdXBvbiBjb25zdHJ1Y3Rpb24gdGhhdCBob2xkcyBhbGwgY2hlY2tvdXQgZm9ybSBlbGVtZW50cy4gQ2hlY2tvdXRDb250cm9sbGVyIHN0b3BwZWQgd29ya2luZycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NoZWNrb3V0Rm9ybSA9IGNoZWNrb3V0Rm9ybURpdkVsZW1lbnQ7XG5cbiAgICAgICAgLy9TZWxlY3QgZWxlbWVudHMuXG4gICAgICAgIGlmKCF0aGlzLnNlbGVjdEFuZFZhbGlkYXRlRWxlbWVudCgnLmpzLWFkZC1jb3Vwb24nLCAnQlVUVE9OJywgZnVuY3Rpb24oZWxlbWVudCkgeyBzZWxmLl9hZGRDb3Vwb25CdXR0b24gPSBlbGVtZW50IH0pKSByZXR1cm47XG4gICAgICAgIGlmKCF0aGlzLnNlbGVjdEFuZFZhbGlkYXRlRWxlbWVudCgnLmpzLWNvdXBvbiBpbnB1dCcsICdJTlBVVCcsIGZ1bmN0aW9uKGVsZW1lbnQpIHsgc2VsZi5fY291cG9uSW5wdXQgPSBlbGVtZW50IH0pKSByZXR1cm47XG4gICAgICAgIGlmKCF0aGlzLnNlbGVjdEFuZFZhbGlkYXRlRWxlbWVudCgnLmpzLWNvdXBvbi1jb2RlcycsICdVTCcsIGZ1bmN0aW9uKGVsZW1lbnQpIHsgc2VsZi5fY291cG9uQ29kZXNMaXN0ID0gZWxlbWVudCB9KSkgcmV0dXJuO1xuICAgICAgICBpZighdGhpcy5zZWxlY3RBbmRWYWxpZGF0ZUVsZW1lbnQoJy5qcy1zdWJtaXQnLCAnSU5QVVQnLCBmdW5jdGlvbihlbGVtZW50KSB7IHNlbGYuX3N1Ym1pdEJ1dHRvbiA9IGVsZW1lbnQgfSkpIHJldHVybjtcbiAgICAgICAgaWYoIXRoaXMuc2VsZWN0QW5kVmFsaWRhdGVFbGVtZW50KCcuanMtdG90YWwtZXgtdmF0LWFuZC1kaXNjb3VudHMnLCAnVEQnLCBmdW5jdGlvbihlbGVtZW50KSB7IHNlbGYuX3RvdGFsRXhWYXRBbmREaXNjb3VudHNDb250YWluZXIgPSBlbGVtZW50IH0pKSByZXR1cm47XG4gICAgICAgIGlmKCF0aGlzLnNlbGVjdEFuZFZhbGlkYXRlRWxlbWVudCgnLmpzLXRvdGFsLWV4LXZhdCcsICdURCcsIGZ1bmN0aW9uKGVsZW1lbnQpIHsgc2VsZi5fdG90YWxFeFZhdENvbnRhaW5lciA9IGVsZW1lbnQgfSkpIHJldHVybjtcbiAgICAgICAgaWYoIXRoaXMuc2VsZWN0QW5kVmFsaWRhdGVFbGVtZW50KCcuanMtdmF0LXRvdGFsJywgJ1NQQU4nLCBmdW5jdGlvbihlbGVtZW50KSB7IHNlbGYuX3ZhdENvbnRhaW5lciA9IGVsZW1lbnQgfSkpIHJldHVybjtcbiAgICAgICAgaWYoIXRoaXMuc2VsZWN0QW5kVmFsaWRhdGVFbGVtZW50KCcuanMtdmF0LXBlcmNlbnRhZ2UnLCAnU1BBTicsIGZ1bmN0aW9uKGVsZW1lbnQpIHsgc2VsZi5fdmF0UGVyY2VudGFnZUNvbnRhaW5lciA9IGVsZW1lbnQgfSkpIHJldHVybjtcbiAgICAgICAgaWYoIXRoaXMuc2VsZWN0QW5kVmFsaWRhdGVFbGVtZW50KCcuanMtc2hpcHBpbmctY29zdHMnLCAnVEQnLCBmdW5jdGlvbihlbGVtZW50KSB7IHNlbGYuX3NoaXBwaW5nQ29zdHNDb250YWluZXIgPSBlbGVtZW50IH0pKSByZXR1cm47XG4gICAgICAgIGlmKCF0aGlzLnNlbGVjdEFuZFZhbGlkYXRlRWxlbWVudCgnLmpzLXRvdGFsJywgJ1REJywgZnVuY3Rpb24oZWxlbWVudCkgeyBzZWxmLl90b3RhbENvbnRhaW5lciA9IGVsZW1lbnQgfSkpIHJldHVybjtcblxuICAgICAgICAvL1NlbGVjdCBvcHRpb25hbCBlbGVtZW50c1xuICAgICAgICB0aGlzLl9ndWVzdExhbmd1YWdlU2VsZWN0V3JhcHBlciA9IHRoaXMuX2NoZWNrb3V0Rm9ybS5xdWVyeVNlbGVjdG9yKCcuanMtbGFuZ3VhZ2Utc2VsZWN0LXdyYXBwZXInKTtcblxuICAgICAgICAvL0NoZWNrIHRoYXQgd2UgaGF2ZSB0aGUgc2hvcHBpbmcgY2FydCBzZXJ2aWNlXG4gICAgICAgIHRoaXMuX2NoZWNrb3V0U2VydmljZSA9IGNoZWNrb3V0U2VydmljZTtcbiAgICAgICAgaWYoIWNoZWNrb3V0U2VydmljZSB8fCAhKGNoZWNrb3V0U2VydmljZSBpbnN0YW5jZW9mIENoZWNrb3V0U2VydmljZSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NoZWNrb3V0Q29udHJvbGxlcjogVGhlIENoZWNrb3V0Q29udHJvbGxlciB3YXMgZXhwZWN0ZWQgdG8gZ2V0IGFuIGluc3RhbmNlIG9mIENoZWNrb3V0U2VydmljZSwgYnV0IGRpZCBub3QgZ2V0IG9uZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2dsb2JhbGlzYXRpb25TZXJ2aWNlID0gZ2xvYmFsaXNhdGlvblNlcnZpY2U7XG4gICAgICAgIGlmKCFnbG9iYWxpc2F0aW9uU2VydmljZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUmVnaXN0ZXJDb250cm9sbGVyOiBUaGUgUmVnaXN0ZXIgZm9ybSB3YXMgZXhwZWN0ZWQgdG8gZ2V0IGFuIGluc3RhbmNlIG9mIFJlZ2lzdGVyU2VydmljZSwgYnV0IGRpZCBub3QgZ2V0IG9uZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vQ2hlY2sgdGhhdCB3ZSBoYXZlIHRoZSBzaG9wcGluZyBjYXJ0IHNlcnZpY2VcbiAgICAgICAgdGhpcy5fc2hvcHBpbmdjYXJ0U2VydmljZSA9IHNob3BwaW5nY2FydFNlcnZpY2U7XG4gICAgICAgIGlmKCFzaG9wcGluZ2NhcnRTZXJ2aWNlIHx8ICEoc2hvcHBpbmdjYXJ0U2VydmljZSBpbnN0YW5jZW9mIFNob3BwaW5nY2FydFNlcnZpY2UpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDaGVja291dENvbnRyb2xsZXI6IFRoZSBDaGVja291dENvbnRyb2xsZXIgd2FzIGV4cGVjdGVkIHRvIGdldCBhbiBpbnN0YW5jZSBvZiBTaG9wcGluZ2NhcnRTZXJ2aWNlLCBidXQgZGlkIG5vdCBnZXQgb25lLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9DaGVjayB0aGF0IHdlIGhhdmUgdGhlIHNob3BwaW5nIGNhcnQgc2VydmljZVxuICAgICAgICB0aGlzLl92YWxpZGF0aW9uU2VydmljZSA9IHZhbGlkYXRpb25TZXJ2aWNlO1xuICAgICAgICBpZighdmFsaWRhdGlvblNlcnZpY2UgfHwgISh2YWxpZGF0aW9uU2VydmljZSBpbnN0YW5jZW9mIFZhbGlkYXRpb25TZXJ2aWNlKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2hlY2tvdXRDb250cm9sbGVyOiBUaGUgQ2hlY2tvdXRDb250cm9sbGVyIHdhcyBleHBlY3RlZCB0byBnZXQgYW4gaW5zdGFuY2Ugb2YgdmFsaWRhdGlvblNlcnZpY2UsIGJ1dCBkaWQgbm90IGdldCBvbmUuJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvL0JpbmQgdGhlIGVycm9yIGxpc3QgY29udHJvbGxlciBpZiB3ZSBoYXZlIGFueS5cbiAgICAgICAgdGhpcy5fZXJyb3JGb3JtQ29udHJvbGxlciA9IGVycm9yRm9ybUNvbnRyb2xsZXI7XG4gICAgICAgIGlmKCF0aGlzLl9lcnJvckZvcm1Db250cm9sbGVyICYmICEoZXJyb3JGb3JtQ29udHJvbGxlciBpbnN0YW5jZW9mIEVycm9yRm9ybUNvbnRyb2xsZXIpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDaGVja291dENvbnRyb2xsZXI6IElmIHlvdSBzcGVjaWZ5IGFuIGVycm9yRm9ybUNvbnRyb2xsZXIsIGl0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgZXJyb3JGb3JtQ29udHJvbGxlcicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZG9tUGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICB0aGlzLl9oaWRkZW5DbGFzcyA9ICd1LWhpZGRlbic7IC8vVGhlIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIHRoaW5ncyB0byBoaWRlIHRoZW0uXG5cbiAgICAgICAgLy9CaW5kIGV2ZW50IGxpc3RlbmVycyB0byB0aGlzIGNsYXNzLlxuICAgICAgICB0aGlzLl9mb3JtU3VibWl0ID0gdGhpcy5fZm9ybVN1Ym1pdC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9mb3JtQ2hhbmdlZCA9IHRoaXMuX2Zvcm1DaGFuZ2VkLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuX3JlbW92ZUNvdXBvbkNvZGVDbGlja2VkID0gdGhpcy5fcmVtb3ZlQ291cG9uQ29kZUNsaWNrZWQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5faGFuZGxlRXJyb3JSZXNwb25zZSA9IHRoaXMuX2hhbmRsZUVycm9yUmVzcG9uc2UuYmluZCh0aGlzKTtcblxuICAgICAgICAvL0JpbmQgb3RoZXIgZnVuY3Rpb24gdG8gdGhpcyBjbGFzc1xuICAgICAgICB0aGlzLl9jcmVhdGVIdG1sRWxlbWVudEZyb21TdHJpbmcgPSB0aGlzLl9jcmVhdGVIdG1sRWxlbWVudEZyb21TdHJpbmcuYmluZCh0aGlzKTtcblxuICAgICAgICAvL0VuYWJsZSB0aGUgbGlzdGVuZXJzLlxuICAgICAgICB0aGlzLmNvbnRyb2xMaXN0ZW5lcnModHJ1ZSk7XG5cbiAgICAgICAgdGhpcy5fZ3Vlc3RDb3VudHJ5Q2hhbmdlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdOYW1lXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gdmFsaWRDYWxsQmFjay4gQ2FsbGVkIHdpdGggdGhlIGZvdW5kIHZhbGlkIGVsZW1lbnQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzZWxlY3RBbmRWYWxpZGF0ZUVsZW1lbnQoc2VsZWN0b3IsIHRhZ05hbWUsIHZhbGlkQ2FsbEJhY2spXG4gICAge1xuICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuX2NoZWNrb3V0Rm9ybS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgaWYoIWVsZW1lbnQgfHwgZWxlbWVudC50YWdOYW1lICE9PSB0YWdOYW1lKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDaGVja291dENvbnRyb2xsZXI6IEV4cGVjdGluZyB0aGUgQ2hlY2tvdXRGb3JtRGl2RWxlbWVudCB0byBoYXZlIGFuICcrdGFnTmFtZSsnIHdpdGggc2VsZWN0b3IgJytzZWxlY3RvcisnLiBCdXQgY291bGQgbm90IGZpbmQgdGhhdCBlbGVtZW50LiBDaGVja291dENvbnRyb2xsZXIgc3RvcHBlZCB3b3JraW5nJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRDYWxsQmFjay5jYWxsKHRoaXMsIGVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKi9cbiAgICBjb250cm9sTGlzdGVuZXJzKGVuYWJsZWQpXG4gICAge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMuX3N1Ym1pdEJ1dHRvbi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2Zvcm1TdWJtaXQpO1xuICAgICAgICB0aGlzLl9hZGRDb3Vwb25CdXR0b24ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9mb3JtU3VibWl0KTtcbiAgICAgICAgdGhpcy5fY2hlY2tvdXRGb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuX2Zvcm1DaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5fY291cG9uQ29kZXNMaXN0LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZWxldGUnKS5mb3JFYWNoKGZ1bmN0aW9uKGRlbGV0ZUJ1dHRvbkVsZW1lbnQpIHtcbiAgICAgICAgICAgIGRlbGV0ZUJ1dHRvbkVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzZWxmLl9yZW1vdmVDb3Vwb25Db2RlQ2xpY2tlZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmKGVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1Ym1pdEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2Zvcm1TdWJtaXQpO1xuICAgICAgICAgICAgdGhpcy5fYWRkQ291cG9uQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fZm9ybVN1Ym1pdCk7XG4gICAgICAgICAgICB0aGlzLl9jaGVja291dEZvcm0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5fZm9ybUNoYW5nZWQpO1xuICAgICAgICAgICAgdGhpcy5fY291cG9uQ29kZXNMaXN0LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZWxldGUnKS5mb3JFYWNoKGZ1bmN0aW9uKGRlbGV0ZUJ1dHRvbkVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGVCdXR0b25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2VsZi5fcmVtb3ZlQ291cG9uQ29kZUNsaWNrZWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgb24gZm9ybSBzdWJtaXQuIFdoZW4gdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgZm9ybSB3b24ndCBiZSBzdWJtaXR0ZWQuXG4gICAgICogV2UgbWFpbmx5IHVzZSBpdCBmb3IgdmFsaWRhdGlvblxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgYXN5bmMgX2Zvcm1TdWJtaXQoZXZlbnQpXG4gICAge1xuICAgICAgICAvL0NhbmNlbCB0aGUgZXZlbnQuIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGNvdW50cnkgaXMgdmFsaWQgZmlyc3RcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgaWYoZXZlbnQuY3VycmVudFRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2pzLXN1Ym1pdCcpKSB7XG4gICAgICAgICAgICB0aGlzLl92YWxpZGF0ZUZvcm0oKS50aGVuKFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9jaGVja291dEZvcm0uc3VibWl0KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgfSBlbHNlIGlmKGV2ZW50LmN1cnJlbnRUYXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqcy1hZGQtY291cG9uJykpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZENvdXBvbkNvZGUoKS50aGVuKGZ1bmN0aW9uKGNvdXBvbikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdhZGRpbmcgY291cG9uIHRvIGxpc3QgZm9yIHVzZXInKVxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9mb3JtQ2hhbmdlZChldmVudClcbiAgICB7XG4gICAgICAgIC8vIHRoaXMuX3ZhbGlkYXRlRm9ybSgpLmNhdGNoKGZ1bmN0aW9uKCkge30pO1xuICAgICAgICBpZihldmVudC50YXJnZXQubmFtZSkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5uYW1lLmluY2x1ZGVzKCdzaGlwcGluZycpKSB7XG4gICAgICAgICAgICAgICAgLy9PbmUgb2YgdGhlIHNoaXBwaW5nIGlucHV0cyBoYXMgYmVlbiBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlU2hpcHBpbmdDb3N0cygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmKGV2ZW50LnRhcmdldC5uYW1lID09PSAnY291bnRyeScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ndWVzdENvdW50cnlDaGFuZ2VkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgc2hpcHBpbmcgY29zdHMuXG4gICAgICovXG4gICAgX3VwZGF0ZVNoaXBwaW5nQ29zdHMoKVxuICAgIHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEodGhpcy5fY2hlY2tvdXRGb3JtKTtcblxuICAgICAgICBsZXQgYWRkcmVzcyA9IG5ldyBBZGRyZXNzKCk7XG4gICAgICAgIGFkZHJlc3Muc3RyZWV0ID0gZm9ybURhdGEuZ2V0KCdzaGlwcGluZ19zdHJlZXQnKTtcbiAgICAgICAgYWRkcmVzcy5ob3VzZV9udW1iZXIgPSBmb3JtRGF0YS5nZXQoJ3NoaXBwaW5nX2hvdXNlX251bWJlcicpO1xuICAgICAgICBhZGRyZXNzLnBvc3RhbF9jb2RlID0gZm9ybURhdGEuZ2V0KCdzaGlwcGluZ19wb3N0YWxfY29kZScpO1xuICAgICAgICBhZGRyZXNzLmNpdHkgPSBmb3JtRGF0YS5nZXQoJ3NoaXBwaW5nX2NpdHknKTtcbiAgICAgICAgYWRkcmVzcy5waG9uZSA9IGZvcm1EYXRhLmdldCgnc2hpcHBpbmdfcGhvbmUnKTtcbiAgICAgICAgYWRkcmVzcy5jb3VudHJ5SXNvMyA9IGZvcm1EYXRhLmdldCgnc2hpcHBpbmdfY291bnRyeScpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCd1cGRhdGluZyBzaGlwcGluZyBjb3N0cyBmb3IgYWRkcmVzczogJywgYWRkcmVzcyk7XG5cbiAgICAgICAgdGhpcy5fY2hlY2tvdXRTZXJ2aWNlLnNldFNoaXBwaW5nQWRkcmVzcyhhZGRyZXNzKS50aGVuKGZ1bmN0aW9uKCkge30pXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgLyoqIEBwYXJhbSB7RXJyb3JSZXNwb25zZX0gcmVzcG9uc2UgKiovXG4gICAgICAgICAgICBzZWxmLl9oYW5kbGVFcnJvclJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgICB9KS5maW5hbGx5KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5fY2hlY2tvdXRTZXJ2aWNlLmdldENoZWNrb3V0SW5mb3JtYXRpb24oKS50aGVuKFxuICAgICAgICAgICAgICAgIC8qKiBAcGFyYW0ge0NoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZX0gY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlICoqL1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGNoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl91cGRhdGVGb3JtVXNpbmdDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UoY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2V9IGNoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3VwZGF0ZUZvcm1Vc2luZ0NoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZShjaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UpXG4gICAge1xuICAgICAgICBjb25zb2xlLmxvZygndXBkYXRlIGZvcm0nKTtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuX3RvdGFsRXhWYXRBbmREaXNjb3VudHNDb250YWluZXIuaW5uZXJIVE1MID0gY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlLnRvdGFsRXhWYXRBbmREaXNjb3VudHNGb3JtYXR0ZWQ7XG4gICAgICAgIHRoaXMuX3RvdGFsRXhWYXRDb250YWluZXIuaW5uZXJIVE1MID0gY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlLnRvdGFsRXhWYXRGb3JtYXR0ZWQ7XG4gICAgICAgIHRoaXMuX3ZhdENvbnRhaW5lci5pbm5lckhUTUwgPSBjaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UudmF0VG90YWxGb3JtYXR0ZWQ7XG4gICAgICAgIHRoaXMuX3ZhdFBlcmNlbnRhZ2VDb250YWluZXIuaW5uZXJIVE1MID0gY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlLnZhdFBlcmNlbnRhZ2U7XG4gICAgICAgIHRoaXMuX3NoaXBwaW5nQ29zdHNDb250YWluZXIuaW5uZXJIVE1MID0gY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlLnNoaXBwaW5nQ29zdHNGb3JtYXR0ZWQ7XG4gICAgICAgIHRoaXMuX3RvdGFsQ29udGFpbmVyLmlubmVySFRNTCA9IGNoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZS50b3RhbEZvcm1hdHRlZDtcblxuICAgICAgICAvL0RlbGV0ZSBhbGwgY291cG9uIGNvZGVzXG4gICAgICAgIHdoaWxlKHRoaXMuX2NvdXBvbkNvZGVzTGlzdC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9jb3Vwb25Db2Rlc0xpc3QucmVtb3ZlQ2hpbGQoc2VsZi5fY291cG9uQ29kZXNMaXN0LmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIC8vQWRkIHRoZSBjb3Vwb24gY29kZXNcbiAgICAgICAgY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlLmNvdXBvbkNvZGVzLmZvckVhY2goZnVuY3Rpb24oY291cG9uQ29kZSkge1xuICAgICAgICAgICAgbGV0IGNvdXBvbkNvZGVMaXN0SXRlbSA9IHNlbGYuX2NyZWF0ZUh0bWxFbGVtZW50RnJvbVN0cmluZygnPGxpIGRhdGEtY29kZT1cIicrY291cG9uQ29kZSsnXCIgZHVzaz1cIicrY291cG9uQ29kZSsnXCI+Jytjb3Vwb25Db2RlKyc8c3BhbiBjbGFzcz1cImRlbGV0ZVwiPiZ0aW1lczs8L3NwYW4+PC9saT4nKTtcbiAgICAgICAgICAgIHNlbGYuX2NvdXBvbkNvZGVzTGlzdC5hcHBlbmRDaGlsZChjb3Vwb25Db2RlTGlzdEl0ZW0pO1xuICAgICAgICAgICAgY291cG9uQ29kZUxpc3RJdGVtLnF1ZXJ5U2VsZWN0b3IoJy5kZWxldGUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNlbGYuX3JlbW92ZUNvdXBvbkNvZGVDbGlja2VkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7UHJvbWlzZTw+IHwgUHJvbWlzZX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF92YWxpZGF0ZUZvcm0oKSB7XG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShzZWxmLl9jaGVja291dEZvcm0pO1xuICAgICAgICAgICAgc2VsZi5fdmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVDaGVja291dEZvcm0oZm9ybURhdGEpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmKHNlbGYuX2Vycm9yRm9ybUNvbnRyb2xsZXIpIHNlbGYuX2Vycm9yRm9ybUNvbnRyb2xsZXIuY2xlYXJBbGxFcnJvcnMoKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgICAgIH0pLmNhdGNoKFxuICAgICAgICAgICAgICAgIC8qKiBAcGFyYW0ge0Vycm9yUmVzcG9uc2V9IGVycm9yUmVzcG9uc2UgICoqL1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vTG9nZ2luZyBpcyBoYW5kbGVkIGluIHRoZSB2YWxpZGF0aW9uU2VydmljZVxuICAgICAgICAgICAgICAgICAgICBpZihzZWxmLl9lcnJvckZvcm1Db250cm9sbGVyKSBzZWxmLl9lcnJvckZvcm1Db250cm9sbGVyLmNsZWFyQWxsRXJyb3JzKCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZUVycm9yUmVzcG9uc2UoZXJyb3JSZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIGFkZCBhIGNvdXBvbiBjb2RlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7UHJvbWlzZTw+IHwgUHJvbWlzZX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9hZGRDb3Vwb25Db2RlKClcbiAgICB7XG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGxldCBlbnRlcmVkQ291cG9uID0gc2VsZi5fY291cG9uSW5wdXQudmFsdWU7XG5cbiAgICAgICAgICAgIHNlbGYuX2NoZWNrb3V0U2VydmljZS5hZGRDb3Vwb24oZW50ZXJlZENvdXBvbikudGhlbihcbiAgICAgICAgICAgICAgICAvKiogQHBhcmFtIHtDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2V9IGNoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZSAgKiovXG4gICAgICAgICAgICBmdW5jdGlvbiAoY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYoc2VsZi5fZXJyb3JGb3JtQ29udHJvbGxlcikgc2VsZi5fZXJyb3JGb3JtQ29udHJvbGxlci5jbGVhckFsbEVycm9ycygpO1xuICAgICAgICAgICAgICAgIHNlbGYuX3VwZGF0ZUZvcm1Vc2luZ0NoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZShjaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIHNlbGYuX2NvdXBvbklucHV0LnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShlbnRlcmVkQ291cG9uKVxuICAgICAgICAgICAgfSkuY2F0Y2goXG4gICAgICAgICAgICAgICAgLyoqIEBwYXJhbSB7RXJyb3JSZXNwb25zZX0gZXJyb3JSZXNwb25zZSAgKiovXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9Mb2dnaW5nIGlzIGhhbmRsZWQgaW4gdGhlIHZhbGlkYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIGlmKHNlbGYuX2Vycm9yRm9ybUNvbnRyb2xsZXIpIHNlbGYuX2Vycm9yRm9ybUNvbnRyb2xsZXIuY2xlYXJBbGxFcnJvcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlRXJyb3JSZXNwb25zZShlcnJvclJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY291cG9uQ29kZVxuICAgICAqL1xuICAgIF9yZW1vdmVDb3Vwb25Db2RlKGNvdXBvbkNvZGUpXG4gICAge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBzZWxmLl9jaGVja291dFNlcnZpY2UucmVtb3ZlQ291cG9uKGNvdXBvbkNvZGUpLnRoZW4oXG4gICAgICAgICAgICAgICAgLyoqIEBwYXJhbSB7Q2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlfSBjaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UgKiovXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGNoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBpZihzZWxmLl9lcnJvckZvcm1Db250cm9sbGVyKSBzZWxmLl9lcnJvckZvcm1Db250cm9sbGVyLmNsZWFyQWxsRXJyb3JzKCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3VwZGF0ZUZvcm1Vc2luZ0NoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZShjaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvdXBvbkNvZGUpXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goXG4gICAgICAgICAgICAgICAgLyoqIEBwYXJhbSB7RXJyb3JSZXNwb25zZX0gZXJyb3JSZXNwb25zZSAgKiovXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9Mb2dnaW5nIGlzIGhhbmRsZWQgaW4gdGhlIHZhbGlkYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIGlmKHNlbGYuX2Vycm9yRm9ybUNvbnRyb2xsZXIpIHNlbGYuX2Vycm9yRm9ybUNvbnRyb2xsZXIuY2xlYXJBbGxFcnJvcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlRXJyb3JSZXNwb25zZShlcnJvclJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9yZW1vdmVDb3Vwb25Db2RlQ2xpY2tlZChldmVudClcbiAgICB7XG4gICAgICAgIGxldCBjb2RlID0gZXZlbnQuY3VycmVudFRhcmdldC5wYXJlbnRFbGVtZW50LmRhdGFzZXQuY29kZTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlQ291cG9uQ29kZShjb2RlKS50aGVuKGZ1bmN0aW9uKCkge30pLmNhdGNoKGZ1bmN0aW9uKCkge30pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgZ3Vlc3QgbGFuZ3VhZ2Ugc2VsZWN0XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9ndWVzdENvdW50cnlDaGFuZ2VkKCkge1xuICAgICAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEodGhpcy5fY2hlY2tvdXRGb3JtKTtcbiAgICAgICAgbGV0IHNlbGVjdCA9IHRoaXMuX2d1ZXN0TGFuZ3VhZ2VTZWxlY3RXcmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJ3NlbGVjdFtuYW1lPVwibGFuZ3VhZ2VcIl0nKTtcbiAgICAgICAgaWYoIWZvcm1EYXRhLmhhcygnY291bnRyeScpIHx8ICF0aGlzLl9ndWVzdExhbmd1YWdlU2VsZWN0V3JhcHBlciB8fCAhc2VsZWN0KSByZXR1cm47IC8vRG8gbm90aGluZyBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIChub3QgYSBndWVzdCkuXG5cbiAgICAgICAgbGV0IGNvdW50cnlJc28zID0gZm9ybURhdGEuZ2V0KCdjb3VudHJ5Jyk7XG5cbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuX2dsb2JhbGlzYXRpb25TZXJ2aWNlLmdldExhbmd1YWdlc0ZvckNvdW50cnlXaXRoSXNvMyhjb3VudHJ5SXNvMykudGhlbihcbiAgICAgICAgICAgIC8qKiBAcGFyYW0geyBDb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UgfSBjb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UgKiovXG4gICAgICAgICAgICBmdW5jdGlvbihjb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBzZWxmLl9jbGVhckxhbmd1YWdlU2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgbGV0IGxhbmd1YWdlQ291bnQgPSBjb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UubGFuZ3VhZ2VzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsYW5ndWFnZUNvdW50OyBpbmRleCsrKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhbmd1YWdlID0gY291bnRyeUxhbmd1YWdlc1Jlc3BvbnNlLmxhbmd1YWdlc1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25FbGVtZW50ID0gc2VsZi5fY3JlYXRlSHRtbEVsZW1lbnRGcm9tU3RyaW5nKCc8b3B0aW9uIHZhbHVlPVwiJytsYW5ndWFnZS50aHJlZUxldHRlcklzb0xhbmd1YWdlTmFtZSsnXCI+JytsYW5ndWFnZS5uYXRpdmVOYW1lKyc8L29wdGlvbj4nKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKG9wdGlvbkVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmKGxhbmd1YWdlQ291bnQgPD0gMSkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9ndWVzdExhbmd1YWdlU2VsZWN0V3JhcHBlci5jbGFzc0xpc3QuYWRkKHNlbGYuX2hpZGRlbkNsYXNzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9ndWVzdExhbmd1YWdlU2VsZWN0V3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKHNlbGYuX2hpZGRlbkNsYXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICkuY2F0Y2goXG4gICAgICAgICAgICAvKiogQHBhcmFtIHsgRXJyb3JSZXNwb25zZSB9IGVycm9yUmVzcG9uc2UgKiovXG4gICAgICAgICAgICBmdW5jdGlvbihlcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvclJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgY3VzdG9tZXIgZGV0YWlscyBsYW5ndWFnZSBzZWxlY3RcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2NsZWFyTGFuZ3VhZ2VTZWxlY3QoKVxuICAgIHtcbiAgICAgICAgbGV0IHNlbGVjdCA9IHRoaXMuX2d1ZXN0TGFuZ3VhZ2VTZWxlY3RXcmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJ3NlbGVjdFtuYW1lPVwibGFuZ3VhZ2VcIl0nKTtcbiAgICAgICAgaWYoIXNlbGVjdCkgcmV0dXJuO1xuXG4gICAgICAgIHdoaWxlKHNlbGVjdC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNlbGVjdC5yZW1vdmVDaGlsZChzZWxlY3QuZmlyc3RDaGlsZCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIExvb3BzIG92ZXIgYW4gZXJyb3Igb2JqZWN0IHRoYXQgY29udGFpbnMgZmllbGQgbmFtZXMsIGFuZCBmb3IgZWFjaCBmaWVsZCBuYW1lIGl0IHdpbGxcbiAgICAgKiBjb2xsZWN0IHRoZSBlcnJvclJlc3BvbnNlIGZyb20gdGhlIGZpZWxkcyB2YWx1ZSAodGhhdCBpcyBhbiBhcnJheSkgYW5kIHBhc3MgdGhlbSB0byB0aGUgZXJyb3JcbiAgICAgKiBsaXN0IGNvbnRyb2xsZXIgd2hpY2ggZGlzcGxheXMgdGhlbVxuICAgICAqXG4gICAgICogQHBhcmFtIHtFcnJvclJlc3BvbnNlfSBlcnJvclJlc3BvbnNlIGFuIG9iamVjdCB3aGVyZSB0aGUgcHJvcGVydGllcyBhcmUgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgdGhhdCBjYXVzZSB0aGUgZXJyb3IuIFRoZWlyIHZhbHVlcyBtdXN0IGJlIGFycmF5cyBjb250YWluaW5nIGVycm9yIHN0cmluZ3MuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaGFuZGxlRXJyb3JSZXNwb25zZShlcnJvclJlc3BvbnNlKSB7XG4gICAgICAgIGlmKCF0aGlzLl9lcnJvckZvcm1Db250cm9sbGVyKSByZXR1cm47XG4gICAgICAgIGZvcihsZXQgZmllbGQgaW4gZXJyb3JSZXNwb25zZS5lcnJvcnMpIHtcbiAgICAgICAgICAgIGlmKCFlcnJvclJlc3BvbnNlLmVycm9ycy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGVycm9ycyA9IGVycm9yUmVzcG9uc2UuZXJyb3JzW2ZpZWxkXS5qb2luKCc8YnI+Jyk7XG4gICAgICAgICAgICB0aGlzLl9lcnJvckZvcm1Db250cm9sbGVyLnNldEZpZWxkRXJyb3IoZmllbGQsIGVycm9ycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tXG4gICAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAgICovXG4gICAgX2NyZWF0ZUh0bWxFbGVtZW50RnJvbVN0cmluZyhmcm9tKVxuICAgIHtcbiAgICAgICAgbGV0IGRvY3VtZW50ID0gdGhpcy5fZG9tUGFyc2VyLnBhcnNlRnJvbVN0cmluZyhmcm9tLCAndGV4dC9odG1sJyk7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5LmZpcnN0Q2hpbGQ7XG4gICAgfVxufVxuXG5leHBvcnQgeyBDaGVja291dENvbnRyb2xsZXIgfSIsImltcG9ydCB7IEVycm9yUmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsL21vZGVscy9lcnJvclJlc3BvbnNlXCI7XG5pbXBvcnQgeyBDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsL21vZGVscy9jaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2VcIjtcblxuLyoqXG4gKiBUaGUgY2hlY2tvdXQgc2VydmljZSBrbm93cyBob3cgdG8gZG8gYXBpIGNhbGxzIGFuZCBoYW5kbGUgdGhlIHJlc3BvbnNlcyBmcm9tIHRoZSBhcGkuXG4gKiBBbGwgcmVsYXRlZCB0byB0aGUgY2hlY2tvdXQgcHJvY2Vzcy4gSXQgZG9lcyBub3QgZG8gYW55dGhpbmcgd2l0aCB0aGUgRE9NLlxuICovXG5jbGFzcyBDaGVja291dFNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9iYXNlUm91dGUgPSAnLyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc2hpcHBpbmcgYWRkcmVzcyBzbyB0aGF0IHRoZSBzaGlwcGluZyBjb3N0cyBmb3IgZXhhbXBsZVxuICAgICAqIGNhbiBiZSBjYWxjdWxhdGVkIG9uIGFkdmFuY2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QWRkcmVzc30gYWRkcmVzc1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IFJlc29sdmVzIHdoZW4gdGhlIHNoaXBwaW5nIGFkZHJlc3MgaXMgc2V0LiBSZWplY3RzIHdpdGggYW4gRXJyb3JSZXNwb25zZSB3aGVuIGl0IGlzIG5vdC5cbiAgICAgKi9cbiAgICBzZXRTaGlwcGluZ0FkZHJlc3MoYWRkcmVzcylcbiAgICB7XG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgQWpheC5wb3N0KFxuICAgICAgICAgICAgICAgIHNlbGYuX2Jhc2VSb3V0ZSsnc2V0U2hpcHBpbmdBZGRyZXNzJyxcbiAgICAgICAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHhocikge1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmKEVycm9yUmVzcG9uc2UuaXMoeGhyLnJlc3BvbnNlLCBmYWxzZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZSA9IEVycm9yUmVzcG9uc2UuZnJvbUpzb25TdHJpbmcoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgbW9zdCByZWNlbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoZWNrb3V0IHByb2Nlc3NcbiAgICAgKi9cbiAgICBnZXRDaGVja291dEluZm9ybWF0aW9uKClcbiAgICB7XG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgQWpheC5nZXQoXG4gICAgICAgICAgICAgICAgc2VsZi5fYmFzZVJvdXRlKydnZXRDaGVja291dEluZm9ybWF0aW9uJyxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbih4aHIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHJlc3BvbnNlID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXNFcnJvclJlc3BvbnNlID0gRXJyb3JSZXNwb25zZS5pcyh4aHIucmVzcG9uc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlID0gQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlLmlzKHhoci5yZXNwb25zZSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmKCFpc0Vycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZSA9IENoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZS5mcm9tSnNvblN0cmluZyh4aHIucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NoZWNrb3V0U2VydmljZTpnZXRDaGVja291dEluZm9ybWF0aW9uIFRoZSByZXNwb25zZSB3YXMgbm90IGEgdmFsaWQgQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlOiAnK3hoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBFcnJvclJlc3BvbnNlLmZyb21Kc29uU3RyaW5nKHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY291cG9uXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBhZGRDb3Vwb24oY291cG9uKSB7XG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICBpZih0eXBlb2YgY291cG9uICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2hlY2tvdXRTZXJ2aWNlOmFkZENvdXBvbiBjb3VsZCBub3QgYWRkIGNvdXBvbi4gSXQgbXVzdCBiZSBhIHN0cmluZyBidXQgd2FzIG5vdC4nKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnQ2hlY2tvdXRTZXJ2aWNlOmFkZENvdXBvbiBjb3VsZCBub3QgYWRkIGNvdXBvbi4gSXQgbXVzdCBiZSBhIHN0cmluZyBidXQgd2FzIG5vdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIEFqYXgucG9zdChcbiAgICAgICAgICAgICAgICBzZWxmLl9iYXNlUm91dGUrJ2FkZENvdXBvbkNvZGUnLFxuICAgICAgICAgICAgICAgIHsnY291cG9uJzogY291cG9ufSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbih4aHIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHJlc3BvbnNlID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXNFcnJvclJlc3BvbnNlID0gRXJyb3JSZXNwb25zZS5pcyh4aHIucmVzcG9uc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlID0gQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlLmlzKHhoci5yZXNwb25zZSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmKCFpc0Vycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZSA9IENoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZS5mcm9tSnNvblN0cmluZyh4aHIucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NoZWNrb3V0U2VydmljZTphZGRDb3Vwb24gVGhlIHJlc3BvbnNlIHdhcyBub3QgYSB2YWxpZCBDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2U6ICcreGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZSA9IEVycm9yUmVzcG9uc2UuZnJvbUpzb25TdHJpbmcoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY291cG9uXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICByZW1vdmVDb3Vwb24oY291cG9uKSB7XG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICBpZih0eXBlb2YgY291cG9uICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2hlY2tvdXRTZXJ2aWNlOnJlbW92ZUNvdXBvbiBjb3VsZCBub3QgcmVtb3ZlIGNvdXBvbi4gSXQgbXVzdCBiZSBhIHN0cmluZyBidXQgd2FzIG5vdC4nLCBjb3Vwb24pO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdDaGVja291dFNlcnZpY2U6cmVtb3ZlQ291cG9uIGNvdWxkIG5vdCByZW1vdmUgY291cG9uLiBJdCBtdXN0IGJlIGEgc3RyaW5nIGJ1dCB3YXMgbm90LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgQWpheC5wb3N0KFxuICAgICAgICAgICAgICAgIHNlbGYuX2Jhc2VSb3V0ZSsncmVtb3ZlQ291cG9uQ29kZScsXG4gICAgICAgICAgICAgICAgeydjb3Vwb24nOiBjb3Vwb259LFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHhocikge1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpc0Vycm9yUmVzcG9uc2UgPSBFcnJvclJlc3BvbnNlLmlzKHhoci5yZXNwb25zZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXNDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UgPSBDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UuaXMoeGhyLnJlc3BvbnNlLCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYoIWlzRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlID0gQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlLmZyb21Kc29uU3RyaW5nKHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2hlY2tvdXRTZXJ2aWNlOnJlbW92ZUNvdXBvbiBUaGUgcmVzcG9uc2Ugd2FzIG5vdCBhIHZhbGlkIENoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZTogJyt4aHIucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gRXJyb3JSZXNwb25zZS5mcm9tSnNvblN0cmluZyh4aHIucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgQ2hlY2tvdXRTZXJ2aWNlIH0iLCIvKipcbiAqIENvbnRyb2xzIGEgZGl2IHdpdGggYW4gdWwgaW4gaXQgdG8gc2hvdyBlcnJvcnMgb3Igbm90XG4gKi9cbmNsYXNzIEVycm9yQ29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3IoKVxuICAgIHtcbiAgICAgICAgdGhpcy5fY2xhc3NUb0hpZGUgPSAndS1oaWRkZW4nO1xuICAgICAgICB0aGlzLl9lcnJvckVsZW1lbnRJZFN1ZmZpeCA9ICdfZXJyb3InO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZFNlbGVjdG9yXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGVycm9yXG4gICAgICovXG4gICAgc2V0RmllbGRFcnJvcihmaWVsZFNlbGVjdG9yLCBlcnJvcilcbiAgICB7XG4gICAgICAgIGxldCBzZWxlY3RvciA9ICcjJytmaWVsZFNlbGVjdG9yK3RoaXMuX2Vycm9yRWxlbWVudElkU3VmZml4O1xuICAgICAgICBsZXQgZXJyb3JFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgIGlmKCFlcnJvckVsZW1lbnQpIHJldHVybjtcblxuICAgICAgICBlcnJvckVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9jbGFzc1RvSGlkZSk7XG4gICAgICAgIGVycm9yRWxlbWVudC5pbm5lclRleHQgPSBlcnJvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRTZWxlY3RvclxuICAgICAqL1xuICAgIGNsZWFyRmllbGRFcnJvcihmaWVsZFNlbGVjdG9yKSB7XG4gICAgICAgIGxldCBzZWxlY3RvciA9ICcjJytmaWVsZFNlbGVjdG9yK3RoaXMuX2Vycm9yRWxlbWVudElkU3VmZml4O1xuICAgICAgICBsZXQgZXJyb3JFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgIGlmICghZXJyb3JFbGVtZW50KSByZXR1cm47XG5cbiAgICAgICAgZXJyb3JFbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5fY2xhc3NUb0hpZGUpO1xuICAgICAgICBlcnJvckVsZW1lbnQuaW5uZXJUZXh0ID0gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIGVycm9yc1xuICAgICAqL1xuICAgIGNsZWFyQWxsRXJyb3JzKCkge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZCQ9Jyt0aGlzLl9lcnJvckVsZW1lbnRJZFN1ZmZpeCsnXScpLmZvckVhY2goZnVuY3Rpb24oZXJyb3JFbGVtZW50KSB7XG4gICAgICAgICAgICBlcnJvckVsZW1lbnQuY2xhc3NMaXN0LmFkZChzZWxmLl9jbGFzc1RvSGlkZSk7XG4gICAgICAgICAgICBlcnJvckVsZW1lbnQuaW5uZXJUZXh0ID0gJyc7XG4gICAgICAgIH0pXG4gICAgfVxufVxuXG5leHBvcnQgeyBFcnJvckNvbnRyb2xsZXIgfSIsIi8qKlxuICogU2hvcHBpbmcgY2FydCBmb3JtIGNvbnRyb2xsZXIuXG4gKi9cbmNsYXNzIFNob3BwaW5nY2FydENvbnRyb2xsZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnR9IHdyYXBwZXJcbiAgICAgKiBAcGFyYW0ge1Nob3BwaW5nY2FydFNlcnZpY2V9IHNob3BwaW5nY2FydFNlcnZpY2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih3cmFwcGVyLCBzaG9wcGluZ2NhcnRTZXJ2aWNlKVxuICAgIHtcbiAgICAgICAgdGhpcy5fd3JhcHBlciA9IHdyYXBwZXI7XG4gICAgICAgIGlmKCF0aGlzLl93cmFwcGVyIHx8IHRoaXMuX3dyYXBwZXIudGFnTmFtZSAhPT0gXCJESVZcIilcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignU2hvcHBpbmdDYXJ0Q29udHJvbGxlcjogVGhlIHNob3BwaW5nQ2FydCBmb3JtIG11c3QgYmUgYSBkaXYgZWxlbWVudCBidXQgd2FzIG5vdCBvciB3YXNuXFwndCBldmVuIHNwZWNpZmllZC4gU2hvcHBpbmdDYXJ0IGNvbnRyb2xsZXIgc3RvcHBlZCB3b3JraW5nJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hZGRUb1Nob3BwaW5nY2FydEJ1dHRvbnMgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1hZGQtcHJvZHVjdC10by1zaG9wcGluZ2NhcnQnKTtcbiAgICAgICAgaWYodGhpcy5fYWRkVG9TaG9wcGluZ2NhcnRCdXR0b25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignU2hvcHBpbmdDYXJ0Q29udHJvbGxlcjogVGhlIHNob3BwaW5nQ2FydCBmb3JtIHdhcyBleHBlY3RlZCB0byBoYXZlIDEgb3IgbW9yZSBhZGQgc2hvcHBpbmcgY2FydCBidXR0b25zIChjbGFzczoganMtYWRkLXByb2R1Y3QtdG8tc2hvcHBpbmdjYXJ0KSBidXQgZ290IG5vbmUuIFNob3BwaW5nQ2FydCBjb250cm9sbGVyIHN0b3BwZWQgd29ya2luZycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbW92ZUZyb21TaG9wcGluZ2NhcnRCdXR0b25zID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCcuanMtcmVtb3ZlLWl0ZW0tZnJvbS1zaG9wcGluZ2NhcnQnKTtcbiAgICAgICAgLy8gaWYodGhpcy5yZW1vdmVGcm9tU2hvcHBpbmdjYXJ0QnV0dG9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUuZXJyb3IoJ1Nob3BwaW5nQ2FydENvbnRyb2xsZXI6IFRoZSBzaG9wcGluZ0NhcnQgZm9ybSB3YXMgZXhwZWN0ZWQgdG8gaGF2ZSAxIG9yIG1vcmUgcmVtb3ZlIHNob3BwaW5nIGNhcnQgaXRlbSBidXR0b25zIChjbGFzczoganMtcmVtb3ZlLWl0ZW0tZnJvbS1zaG9wcGluZ2NhcnQpIGJ1dCBnb3Qgbm9uZS4gU2hvcHBpbmdDYXJ0IGNvbnRyb2xsZXIgc3RvcHBlZCB3b3JraW5nJyk7XG4gICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgIC8vIH1cbiAgICAgICAgdGhpcy5fY2hhbmdlUXVhbnRpdHlTaG9wcGluZ2NhcnRJdGVtQnV0dG9ucyA9IHdyYXBwZXIucXVlcnlTZWxlY3RvckFsbCgnLmpzLWNoYW5nZS1xdWFudGl0eS1vZi1zaG9wcGluZ2NhcnQtaXRlbScpO1xuICAgICAgICAvLyBpZih0aGlzLmNoYW5nZVF1YW50aXR5U2hvcHBpbmdjYXJ0SXRlbUJ1dHRvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmVycm9yKCdTaG9wcGluZ0NhcnRDb250cm9sbGVyOiBUaGUgc2hvcHBpbmdDYXJ0IGZvcm0gd2FzIGV4cGVjdGVkIHRvIGhhdmUgMSBvciBtb3JlIGNoYW5nZSBxdWFudGl0eSBidXR0b25zIChjbGFzczoganMtY2hhbmdlLXF1YW50aXR5LW9mLXNob3BwaW5nY2FydC1pdGVtKSBidXQgZ290IG5vbmUuIFNob3BwaW5nQ2FydCBjb250cm9sbGVyIHN0b3BwZWQgd29ya2luZycpO1xuICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAvLyB9XG4gICAgICAgIHRoaXMuX3Nob3BwaW5nY2FydFNlcnZpY2UgPSBzaG9wcGluZ2NhcnRTZXJ2aWNlO1xuICAgICAgICBpZighc2hvcHBpbmdjYXJ0U2VydmljZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignU2hvcHBpbmdDYXJ0Q29udHJvbGxlcjogVGhlIHNob3BwaW5nQ2FydENvbnRyb2xsZXIgd2FzIGV4cGVjdGVkIHRvIGdldCBhbiBpbnN0YW5jZSBvZiBTaG9wcGluZ2NhcnRTZXJ2aWNlLCBidXQgZGlkIG5vdCBnZXQgb25lLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGRQcm9kdWN0QnV0dG9uQ2xpY2tlZCA9IHRoaXMuYWRkUHJvZHVjdEJ1dHRvbkNsaWNrZWQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZW1vdmVQcm9kdWN0QnV0dG9uQ2xpY2tlZCA9IHRoaXMucmVtb3ZlUHJvZHVjdEJ1dHRvbkNsaWNrZWQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VRdWFudGl0eUJ1dHRvbkNsaWNrZWQgPSB0aGlzLmNoYW5nZVF1YW50aXR5QnV0dG9uQ2xpY2tlZC5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuY29udHJvbExpc3RlbmVycyh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgb3IgZGlzYWJsZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbmFibGVcbiAgICAgKi9cbiAgICBjb250cm9sTGlzdGVuZXJzKGVuYWJsZSA9IHRydWUpIHtcbiAgICAgICAgbGV0IGFkZFRvU2hvcHBpbmdjYXJ0QnV0dG9uc0xlbmd0aCA9IHRoaXMuX2FkZFRvU2hvcHBpbmdjYXJ0QnV0dG9ucy5sZW5ndGg7XG4gICAgICAgIGxldCByZW1vdmVGcm9tU2hvcHBpbmdjYXJ0QnV0dG9uc0xlbmd0aCA9IHRoaXMuX3JlbW92ZUZyb21TaG9wcGluZ2NhcnRCdXR0b25zLmxlbmd0aDtcbiAgICAgICAgbGV0IGNoYW5nZVF1YW50aXR5U2hvcHBpbmdjYXJ0SXRlbUJ1dHRvbnNMZW5ndGggPSB0aGlzLl9jaGFuZ2VRdWFudGl0eVNob3BwaW5nY2FydEl0ZW1CdXR0b25zLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYWRkVG9TaG9wcGluZ2NhcnRCdXR0b25zTGVuZ3RoOyBpbmRleCsrKSB0aGlzLl9hZGRUb1Nob3BwaW5nY2FydEJ1dHRvbnNbaW5kZXhdLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5hZGRQcm9kdWN0QnV0dG9uQ2xpY2tlZCk7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCByZW1vdmVGcm9tU2hvcHBpbmdjYXJ0QnV0dG9uc0xlbmd0aDsgaW5kZXgrKykgdGhpcy5fcmVtb3ZlRnJvbVNob3BwaW5nY2FydEJ1dHRvbnNbaW5kZXhdLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5yZW1vdmVQcm9kdWN0QnV0dG9uQ2xpY2tlZCk7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjaGFuZ2VRdWFudGl0eVNob3BwaW5nY2FydEl0ZW1CdXR0b25zTGVuZ3RoOyBpbmRleCsrKSB0aGlzLl9jaGFuZ2VRdWFudGl0eVNob3BwaW5nY2FydEl0ZW1CdXR0b25zW2luZGV4XS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuY2hhbmdlUXVhbnRpdHlCdXR0b25DbGlja2VkKTtcblxuICAgICAgICBpZihlbmFibGUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhZGRUb1Nob3BwaW5nY2FydEJ1dHRvbnNMZW5ndGg7IGluZGV4KyspIHRoaXMuX2FkZFRvU2hvcHBpbmdjYXJ0QnV0dG9uc1tpbmRleF0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmFkZFByb2R1Y3RCdXR0b25DbGlja2VkKTtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCByZW1vdmVGcm9tU2hvcHBpbmdjYXJ0QnV0dG9uc0xlbmd0aDsgaW5kZXgrKykgdGhpcy5fcmVtb3ZlRnJvbVNob3BwaW5nY2FydEJ1dHRvbnNbaW5kZXhdLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5yZW1vdmVQcm9kdWN0QnV0dG9uQ2xpY2tlZCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY2hhbmdlUXVhbnRpdHlTaG9wcGluZ2NhcnRJdGVtQnV0dG9uc0xlbmd0aDsgaW5kZXgrKykgdGhpcy5fY2hhbmdlUXVhbnRpdHlTaG9wcGluZ2NhcnRJdGVtQnV0dG9uc1tpbmRleF0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNoYW5nZVF1YW50aXR5QnV0dG9uQ2xpY2tlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50XG4gICAgICovXG4gICAgYWRkUHJvZHVjdEJ1dHRvbkNsaWNrZWQoZXZlbnQpXG4gICAge1xuICAgICAgICBpZighKFwicHJvZHVjdElkXCIgaW4gZXZlbnQudGFyZ2V0LmRhdGFzZXQpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTaG9wcGluZ0NhcnRDb250cm9sbGVyOiBFeHBlY3RlZCBhbiBhZGQgYnV0dG9uIHRvIGhhdmUgdGhlIGRhdGEtcHJvZHVjdC1pZCBhdHRyaWJ1dGUgc2V0LiBCdXQgZGlkIG5vdCBoYXZlIHRoYXQuIE5vdCBwcm9jZXNzaW5nIGNsaWNrJywgZXZlbnQudGFyZ2V0LmRhdGFzZXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmKCEoXCJwcm9kdWN0VHlwZVwiIGluIGV2ZW50LnRhcmdldC5kYXRhc2V0KSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignU2hvcHBpbmdDYXJ0Q29udHJvbGxlcjogRXhwZWN0ZWQgYW4gYWRkIGJ1dHRvbiB0byBoYXZlIHRoZSBkYXRhLXR5cGUgYXR0cmlidXRlIHNldC4gQnV0IGRpZCBub3QgaGF2ZSB0aGF0LiBOb3QgcHJvY2Vzc2luZyBjbGljaycsIGV2ZW50LnRhcmdldC5kYXRhc2V0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zaG9wcGluZ2NhcnRTZXJ2aWNlLl9hZGRQcm9kdWN0VG9TaG9wcGluZ2NhcnQoZXZlbnQudGFyZ2V0LmRhdGFzZXQucHJvZHVjdElkLCBldmVudC50YXJnZXQuZGF0YXNldC5wcm9kdWN0VHlwZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudFxuICAgICAqL1xuICAgIHJlbW92ZVByb2R1Y3RCdXR0b25DbGlja2VkKGV2ZW50KVxuICAgIHtcbiAgICAgICAgaWYoIShcInByb2R1Y3RJZFwiIGluIGV2ZW50LnRhcmdldC5kYXRhc2V0KSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignU2hvcHBpbmdDYXJ0Q29udHJvbGxlcjogRXhwZWN0ZWQgYW4gYWRkIGJ1dHRvbiB0byBoYXZlIHRoZSBkYXRhLXByb2R1Y3QtaWQgYXR0cmlidXRlIHNldC4gQnV0IGRpZCBub3QgaGF2ZSB0aGF0LiBOb3QgcHJvY2Vzc2luZyBjbGljaycsIGV2ZW50LnRhcmdldC5kYXRhc2V0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZighKFwicHJvZHVjdFR5cGVcIiBpbiBldmVudC50YXJnZXQuZGF0YXNldCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Nob3BwaW5nQ2FydENvbnRyb2xsZXI6IEV4cGVjdGVkIGFuIGFkZCBidXR0b24gdG8gaGF2ZSB0aGUgZGF0YS10eXBlIGF0dHJpYnV0ZSBzZXQuIEJ1dCBkaWQgbm90IGhhdmUgdGhhdC4gTm90IHByb2Nlc3NpbmcgY2xpY2snLCBldmVudC50YXJnZXQuZGF0YXNldCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2hvcHBpbmdjYXJ0U2VydmljZS5fcmVtb3ZlSXRlbUZyb21TaG9wcGluZ2NhcnQoZXZlbnQudGFyZ2V0LmRhdGFzZXQucHJvZHVjdElkLCBldmVudC50YXJnZXQuZGF0YXNldC5wcm9kdWN0VHlwZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudFxuICAgICAqL1xuICAgIGNoYW5nZVF1YW50aXR5QnV0dG9uQ2xpY2tlZChldmVudClcbiAgICB7XG4gICAgICAgIGlmKCEoXCJzaG9wcGluZ2NhcnRJdGVtSWRcIiBpbiBldmVudC50YXJnZXQuZGF0YXNldCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Nob3BwaW5nQ2FydENvbnRyb2xsZXI6IEV4cGVjdGVkIGFuIGFkZCBidXR0b24gdG8gaGF2ZSB0aGUgZGF0YS1zaG9wcGluZ2NhcnQtaXRlbS1pZCBhdHRyaWJ1dGUgc2V0LiBCdXQgZGlkIG5vdCBoYXZlIHRoYXQuIE5vdCBwcm9jZXNzaW5nIGNsaWNrJywgZXZlbnQudGFyZ2V0LmRhdGFzZXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmKCEoXCJxdWFudGl0eVwiIGluIGV2ZW50LnRhcmdldC5kYXRhc2V0KSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignU2hvcHBpbmdDYXJ0Q29udHJvbGxlcjogRXhwZWN0ZWQgYW4gYWRkIGJ1dHRvbiB0byBoYXZlIHRoZSBkYXRhLXF1YW50aXR5IGF0dHJpYnV0ZSBzZXQuIEJ1dCBkaWQgbm90IGhhdmUgdGhhdC4gTm90IHByb2Nlc3NpbmcgY2xpY2snLCBldmVudC50YXJnZXQuZGF0YXNldCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2hvcHBpbmdjYXJ0U2VydmljZS5fc2V0SXRlbVF1YW50aXR5SW5TaG9wcGluZ2NhcnQoZXZlbnQudGFyZ2V0LmRhdGFzZXQuc2hvcHBpbmdjYXJ0SXRlbUlkLCBldmVudC50YXJnZXQuZGF0YXNldC5xdWFudGl0eSk7XG4gICAgfVxuXG4gICAgdXBkYXRlQ2FydEJ1dHRvbkNvdW50ZXIoKVxuICAgIHtcbiAgICAgICAgbGV0IGNvdW50ID0gdGhpcy5fd3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCcuc2hvcHBpbmdjYXJ0SXRlbUxpc3QgdWwgbGknKS5sZW5ndGg7XG4gICAgICAgIGxldCBjb3VudGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNob3BwaW5nQ2FydEJ1dHRvbiBzcGFuLnNob3BwaW5nQ2FydEJ1dHRvbkNvdW50ZXInKTtcbiAgICAgICAgY291bnRlci5pbm5lclRleHQoY291bnQpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgU2hvcHBpbmdjYXJ0Q29udHJvbGxlciB9IiwiY2xhc3MgU2hvcHBpbmdjYXJ0U2VydmljZVxue1xuICAgIGNvbnN0cnVjdG9yKClcbiAgICB7XG4gICAgICAgIHRoaXMuX2Jhc2VSb3V0ZSA9ICcvJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgcHJvZHVjdCB0byB0aGUgc2hvcHBpbmcgY2FydFxuICAgICAqXG4gICAgICogQHBhcmFtIGlkXG4gICAgICogQHBhcmFtIHR5cGVcbiAgICAgKi9cbiAgICBfYWRkUHJvZHVjdFRvU2hvcHBpbmdjYXJ0KGlkLCB0eXBlKSB7XG4gICAgICAgIGxldCBxdWFudGl0eSA9IDEwO1xuXG4gICAgICAgIEFqYXgucG9zdChcbiAgICAgICAgICAgIHRoaXMuX2Jhc2VSb3V0ZSsnYWRkUHJvZHVjdFRvU2hvcHBpbmdjYXJ0JyxcbiAgICAgICAgICAgIHtwcm9kdWN0YWJsZUlkOiBpZCwgaXRlbVR5cGU6IHR5cGUsIHF1YW50aXR5OiBxdWFudGl0eX0sXG4gICAgICAgICAgICBmdW5jdGlvbih4aHIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh4aHIpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHhoci5yZXNwb25zZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBwcm9kdWN0IGZyb20gdGhlIHNob3BwaW5nIGNhcnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZFxuICAgICAqIEBwYXJhbSB0eXBlXG4gICAgICovXG4gICAgX3JlbW92ZUl0ZW1Gcm9tU2hvcHBpbmdjYXJ0KGlkLCB0eXBlKSB7XG4gICAgICAgIEFqYXgucG9zdChcbiAgICAgICAgICAgIHRoaXMuX2Jhc2VSb3V0ZSsncmVtb3ZlSXRlbUZyb21TaG9wcGluZ2NhcnQnLFxuICAgICAgICAgICAge3Byb2R1Y3RhYmxlSWQ6IGlkLCBpdGVtVHlwZTogdHlwZX0sXG4gICAgICAgICAgICBmdW5jdGlvbih4aHIpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB4aHIucmVzcG9uc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgcXVhbnRpdHkgb2YgYSBzaG9wcGluZyBjYXJ0IGl0ZW1cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZFxuICAgICAqIEBwYXJhbSBxdWFudGl0eVxuICAgICAqL1xuICAgIF9zZXRJdGVtUXVhbnRpdHlJblNob3BwaW5nY2FydChpZCwgcXVhbnRpdHkpIHtcbiAgICAgICAgaWYgKHF1YW50aXR5ID4gMCkge1xuICAgICAgICAgICAgQWpheC5wb3N0KFxuICAgICAgICAgICAgICAgICcvc2V0SXRlbVF1YW50aXR5SW5TaG9wcGluZ2NhcnQnLFxuICAgICAgICAgICAgICAgIHtpdGVtSWQ6IGlkLCBxdWFudGl0eTogcXVhbnRpdHl9LFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHhocikge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB4aHIucmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUl0ZW1Gcm9tU2hvcHBpbmdjYXJ0KGlkKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmV4cG9ydCB7IFNob3BwaW5nY2FydFNlcnZpY2UgfSIsImltcG9ydCB7IEVycm9yUmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsL21vZGVscy9lcnJvclJlc3BvbnNlXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsL21vZGVscy92YWxpZGF0aW9uUmVzcG9uc2VcIjtcblxuY2xhc3MgVmFsaWRhdGlvblNlcnZpY2Uge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Rm9ybURhdGF9IGRhdGFcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICAqL1xuICAgIHZhbGlkYXRlQ2hlY2tvdXRGb3JtKGRhdGEpIHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGlmKCEoZGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignVmFsaWRhdGlvblNlcnZpY2U6dmFsaWRhdGVDaGVja291dEZvcm0gY291bGQgbm90IHZhbGlkYXRlIGZvcm0gc2luY2Ugbm8gdmFsaWQgRm9ybURhdGEgaW5zdGFuY2Ugd2FzIGdpdmVuLicpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdWYWxpZGF0aW9uU2VydmljZTp2YWxpZGF0ZUNoZWNrb3V0Rm9ybSBjb3VsZCBub3QgdmFsaWRhdGUgZm9ybSBzaW5jZSBubyB2YWxpZCBGb3JtRGF0YSBpbnN0YW5jZSB3YXMgZ2l2ZW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBBamF4LnBvc3RGb3JtRGF0YShcbiAgICAgICAgICAgICAgICAnL3ZhbGlkYXRpb24vZm9ybS9jaGVja291dCcsXG4gICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbih4aHIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzRXJyb3JSZXNwb25zZSA9IEVycm9yUmVzcG9uc2UuaXMoeGhyLnJlc3BvbnNlLCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYoIWlzRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yUmVzcG9uc2UuZnJvbUpzb25TdHJpbmcoeGhyLnJlc3BvbnNlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFZhbGlkYXRpb25TZXJ2aWNlIH0iLCIvKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqICBJbXBvcnQgRVM2IE1vZHVsZXMgKGh0dHBzOi8vd2VicGFjay5qcy5vcmcvYXBpL21vZHVsZS1tZXRob2RzLylcbiAqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbmltcG9ydCB7IEdsb2JhbGlzYXRpb25TZXJ2aWNlIH0gZnJvbSBcIi4vY29tcG9uZW50cy9HbG9iYWxpc2F0aW9uU2VydmljZVwiO1xuaW1wb3J0IHsgUmVnaXN0ZXJDb250cm9sbGVyIH0gZnJvbSBcIi4vY29tcG9uZW50cy9SZWdpc3RlckNvbnRyb2xsZXJcIjtcblxuaW1wb3J0IHsgQ2hlY2tvdXRDb250cm9sbGVyIH0gZnJvbSAnLi8uLi9zaG9wL2NvbXBvbmVudHMvY2hlY2tvdXRDb250cm9sbGVyJztcbmltcG9ydCB7IFNob3BwaW5nY2FydENvbnRyb2xsZXIgfSBmcm9tICcuLi9zaG9wL2NvbXBvbmVudHMvc2hvcHBpbmdjYXJ0Q29udHJvbGxlcic7XG5pbXBvcnQgeyBTaG9wcGluZ2NhcnRTZXJ2aWNlIH0gZnJvbSBcIi4uL3Nob3AvY29tcG9uZW50cy9zaG9wcGluZ2NhcnRTZXJ2aWNlXCI7XG5pbXBvcnQgeyBDaGVja291dFNlcnZpY2UgfSBmcm9tIFwiLi4vc2hvcC9jb21wb25lbnRzL2NoZWNrb3V0U2VydmljZVwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vc2hvcC9jb21wb25lbnRzL3ZhbGlkYXRpb25TZXJ2aWNlXCI7XG5pbXBvcnQgeyBFcnJvckNvbnRyb2xsZXIgfSBmcm9tIFwiLi4vc2hvcC9jb21wb25lbnRzL2Vycm9yQ29udHJvbGxlclwiO1xuXG4vKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqICBEZXBlbmRlbmNpZXNcbiAqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuLyoqXG4gKiBFeHRlcm5hbFxuICovXG5yZXF1aXJlKCdoYW1tZXJqcycpO1xucmVxdWlyZSgnb2JqZWN0Rml0UG9seWZpbGwnKTtcblxuLyoqXG4gKiBHbG9iYWwgLyBTaGFyZWQgd2l0aCBLTVNcbiAqL1xucmVxdWlyZSgnLi8uLi9nbG9iYWwvcG9seWZpbGxzL2V2ZW50UG9seUZpbGwnKTtcbnJlcXVpcmUoJy4vLi4vZ2xvYmFsL3BvbHlmaWxscy9pc0ludGVnZXInKTtcbnJlcXVpcmUoJy4vLi4vZ2xvYmFsL3BvbHlmaWxscy9wcm9taXNlJyk7XG5cbi8qKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogIEdsb2JhbCBmdW5jdGlvbmFsaXRpZXNcbiAqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxucmVxdWlyZSgnLi9nbG9iYWwvaGVscGVycycpOyAvLyBTaG91bGQgYmUgZmlyc3RcbnJlcXVpcmUoJy4vZ2xvYmFsL2Jyb3dzZXJIYW5kbGVyJyk7XG4vLyByZXF1aXJlKCcuL2dsb2JhbC9wYWdldHJhbnNpdGlvbkhhbmRsZXInKTtcbi8vIHJlcXVpcmUoJy4vZ2xvYmFsL3Jlc2l6ZUhhbmRsZXInKTtcbnJlcXVpcmUoJy4vZ2xvYmFsL3Njcm9sbEhhbmRsZXInKTtcblxuXG4vKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqICBDb21wb25lbnQgZnVuY3Rpb25hbGl0aWVzXG4gKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jaG9jb2xhdGVGYWN0b3J5Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY29va2llSGFuZGxlcicpO1xuLy8gcmVxdWlyZSgnLi9jb21wb25lbnRzL0lucHV0SGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL21hcHNIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvb3ZlcmxheU1lbnVIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvcHJvamVjdG9ySGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3Njcm9sbFRvSGFuZGxlcicpO1xuLy8gcmVxdWlyZSgnLi9jb21wb25lbnRzL3NlYXJjaEhhbmRsZXInKTtcbi8vIHJlcXVpcmUoJy4vY29tcG9uZW50cy9zaGFyZUJ1dHRvbnNIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMveW91dHViZUhhbmRsZXInKTtcblxuLyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiAgU2hvcCBDb21wb25lbnQgZnVuY3Rpb25hbGl0aWVzXG4gKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5sZXQgY2hlY2tvdXRGb3JtRGl2RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jaGVja291dC1mb3JtJyk7XG5pZihjaGVja291dEZvcm1EaXZFbGVtZW50KSBuZXcgQ2hlY2tvdXRDb250cm9sbGVyKFxuICAgIGNoZWNrb3V0Rm9ybURpdkVsZW1lbnQsXG4gICAgbmV3IFNob3BwaW5nY2FydFNlcnZpY2UoKSxcbiAgICBuZXcgQ2hlY2tvdXRTZXJ2aWNlKCksXG4gICAgbmV3IFZhbGlkYXRpb25TZXJ2aWNlKCksXG4gICAgbmV3IEdsb2JhbGlzYXRpb25TZXJ2aWNlKCksXG4gICAgbmV3IEVycm9yQ29udHJvbGxlcigpXG4pO1xuXG5sZXQgc2hvcHBpbmdDYXJ0RGl2RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jYXJ0Jyk7XG5pZihzaG9wcGluZ0NhcnREaXZFbGVtZW50KSBuZXcgU2hvcHBpbmdjYXJ0Q29udHJvbGxlcihzaG9wcGluZ0NhcnREaXZFbGVtZW50LCBuZXcgU2hvcHBpbmdjYXJ0U2VydmljZSgpKTtcblxubGV0IHJlZ2lzdGVyRm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWdpc3RlckZvcm0nKTtcbmlmKHJlZ2lzdGVyRm9ybSkgbmV3IFJlZ2lzdGVyQ29udHJvbGxlcihyZWdpc3RlckZvcm0sIG5ldyBHbG9iYWxpc2F0aW9uU2VydmljZSgpKTtcblxuIiwiaW1wb3J0IHsgRXJyb3JSZXNwb25zZSB9IGZyb20gXCIuLi8uLi9nbG9iYWwvbW9kZWxzL2Vycm9yUmVzcG9uc2VcIjtcbmltcG9ydCB7IENvdW50cnlMYW5ndWFnZXNSZXNwb25zZSB9IGZyb20gXCIuLi8uLi9nbG9iYWwvbW9kZWxzL2NvdW50cnlMYW5ndWFnZXNSZXNwb25zZVwiO1xuXG5jbGFzcyBHbG9iYWxpc2F0aW9uU2VydmljZVxue1xuICAgIGNvbnN0cnVjdG9yKClcbiAgICB7XG4gICAgICAgIHRoaXMuX2Jhc2VSb3V0ZSA9ICcvJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgcHJvZHVjdCB0byB0aGUgc2hvcHBpbmcgY2FydFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvdW50cnlJc28zXG4gICAgICovXG4gICAgZ2V0TGFuZ3VhZ2VzRm9yQ291bnRyeVdpdGhJc28zKGNvdW50cnlJc28zKSB7XG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBBamF4LnBvc3QoXG4gICAgICAgICAgICAgICAgc2VsZi5fYmFzZVJvdXRlKydnZXRMYW5ndWFnZXNGb3JDb3VudHJ5V2l0aElzbzMnLFxuICAgICAgICAgICAgICAgIHsgY291bnRyeUlzbzM6IGNvdW50cnlJc28zIH0sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oeGhyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxldCByZXNwb25zZSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzRXJyb3JSZXNwb25zZSA9IEVycm9yUmVzcG9uc2UuaXMoeGhyLnJlc3BvbnNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpc0NvdW50cnlMYW5ndWFnZXNSZXNwb25zZSA9IENvdW50cnlMYW5ndWFnZXNSZXNwb25zZS5pcyh4aHIucmVzcG9uc2UsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgICAgICBpZighaXNFcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihpc0NvdW50cnlMYW5ndWFnZXNSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UgPSBDb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UuZnJvbUpzb25TdHJpbmcoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvdW50cnlMYW5ndWFnZXNSZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZWdpc3RlclNlcnZpY2U6Z2V0TGFuZ3VhZ2VzRm9yQ291bnRyeVdpdGhJc28zIFRoZSByZXNwb25zZSB3YXMgbm90IGEgdmFsaWQgQ291bnRyeUxhbmd1YWdlc1Jlc3BvbnNlOiAnK3hoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBFcnJvclJlc3BvbnNlLmZyb21Kc29uU3RyaW5nKHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuZXhwb3J0IHsgR2xvYmFsaXNhdGlvblNlcnZpY2UgfSIsImNsYXNzIFJlZ2lzdGVyQ29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gd3JhcHBlclxuICAgICAqIEBwYXJhbSB7R2xvYmFsaXNhdGlvblNlcnZpY2V9IGdsb2JhbGlzYXRpb25TZXJ2aWNlXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iod3JhcHBlciwgZ2xvYmFsaXNhdGlvblNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5fd3JhcHBlciA9IHdyYXBwZXI7XG4gICAgICAgIGlmKCF0aGlzLl93cmFwcGVyIHx8IHRoaXMuX3dyYXBwZXIudGFnTmFtZSAhPT0gXCJGT1JNXCIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlZ2lzdGVyQ29udHJvbGxlcjogVGhlIFJlZ2lzdGVyIGZvcm0gbXVzdCBiZSBhIGRpdiBlbGVtZW50IGJ1dCB3YXMgbm90IG9yIHdhc25cXCd0IGV2ZW4gc3BlY2lmaWVkLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY291bnRyeVNlbGVjdCA9IHRoaXMuX3dyYXBwZXIucXVlcnlTZWxlY3Rvcignc2VsZWN0W25hbWU9XCJjb3VudHJ5XCJdJyk7XG4gICAgICAgIGlmKCF0aGlzLl9jb3VudHJ5U2VsZWN0KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZWdpc3RlckNvbnRyb2xsZXI6IFRoZSBSZWdpc3RlciBmb3JtIG11c3QgaGF2ZSBhIHNlbGVjdCBlbGVtZW50IHdpdGggbmFtZSBcImNvdW50cnlcIiBidXQgZGlkIG5vdCBoYXZlIGl0LicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VTZWxlY3QgPSB0aGlzLl93cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJ3NlbGVjdFtuYW1lPVwibGFuZ3VhZ2VcIl0nKTtcbiAgICAgICAgaWYoIXRoaXMuX2NvdW50cnlTZWxlY3QpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlZ2lzdGVyQ29udHJvbGxlcjogVGhlIFJlZ2lzdGVyIGZvcm0gbXVzdCBoYXZlIGEgc2VsZWN0IGVsZW1lbnQgd2l0aCBuYW1lIFwibGFuZ3VhZ2VcIiBidXQgZGlkIG5vdCBoYXZlIGl0LicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VTZWxlY3RXcmFwcGVyID0gdGhpcy5fd3JhcHBlci5xdWVyeVNlbGVjdG9yKCcuanMtbGFuZ3VhZ2Utd3JhcHBlcicpO1xuICAgICAgICBpZighdGhpcy5fbGFuZ3VhZ2VTZWxlY3RXcmFwcGVyIHx8IHRoaXMuX2xhbmd1YWdlU2VsZWN0V3JhcHBlci50YWdOYW1lICE9PSBcIkRJVlwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZWdpc3RlckNvbnRyb2xsZXI6IFRoZSBSZWdpc3RlciBmb3JtIG11c3QgaGF2ZSBhIHdyYXBwZXIgRElWIGVsZW1lbnQgd2l0aCBjbGFzcyBcImpzLWxhbmd1YWdlLXdyYXBwZXJcIiBidXQgZGlkIG5vdCBoYXZlIGl0LicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cblxuICAgICAgICB0aGlzLl9nbG9iYWxpc2F0aW9uU2VydmljZSA9IGdsb2JhbGlzYXRpb25TZXJ2aWNlO1xuICAgICAgICBpZighZ2xvYmFsaXNhdGlvblNlcnZpY2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlZ2lzdGVyQ29udHJvbGxlcjogVGhlIFJlZ2lzdGVyIGZvcm0gd2FzIGV4cGVjdGVkIHRvIGdldCBhbiBpbnN0YW5jZSBvZiBSZWdpc3RlclNlcnZpY2UsIGJ1dCBkaWQgbm90IGdldCBvbmUuJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9oaWRkZW5DbGFzcyA9ICd1LWhpZGRlbic7IC8vVGhlIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIHRoaW5ncyB0byBoaWRlIHRoZW0uXG5cbiAgICAgICAgdGhpcy5fZG9tUGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuXG4gICAgICAgIHRoaXMuX2NvdW50cnlDaGFuZ2VkID0gdGhpcy5fY291bnRyeUNoYW5nZWQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5jb250cm9sTGlzdGVuZXJzKHRydWUpO1xuXG4gICAgICAgIHRoaXMuX2NvdW50cnlDaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgY29udHJvbExpc3RlbmVycyhlbmFibGUgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX2NvdW50cnlTZWxlY3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5fY291bnRyeUNoYW5nZWQpO1xuXG4gICAgICAgIGlmKGVuYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5fY291bnRyeVNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLl9jb3VudHJ5Q2hhbmdlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9jb3VudHJ5Q2hhbmdlZCgpIHtcbiAgICAgICAgbGV0IGNvdW50cnlJc28zID0gdGhpcy5fY291bnRyeVNlbGVjdC52YWx1ZTtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuX2dsb2JhbGlzYXRpb25TZXJ2aWNlLmdldExhbmd1YWdlc0ZvckNvdW50cnlXaXRoSXNvMyhjb3VudHJ5SXNvMykudGhlbihcbiAgICAgICAgICAgIC8qKiBAcGFyYW0geyBDb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UgfSBjb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UgKiovXG4gICAgICAgICAgICBmdW5jdGlvbihjb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBzZWxmLl9jbGVhckxhbmd1YWdlU2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgbGV0IGxhbmd1YWdlQ291bnQgPSBjb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UubGFuZ3VhZ2VzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsYW5ndWFnZUNvdW50OyBpbmRleCsrKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhbmd1YWdlID0gY291bnRyeUxhbmd1YWdlc1Jlc3BvbnNlLmxhbmd1YWdlc1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25FbGVtZW50ID0gc2VsZi5fY3JlYXRlSHRtbEVsZW1lbnRGcm9tU3RyaW5nKCc8b3B0aW9uIHZhbHVlPVwiJytsYW5ndWFnZS50aHJlZUxldHRlcklzb0xhbmd1YWdlTmFtZSsnXCI+JytsYW5ndWFnZS5uYXRpdmVOYW1lKyc8L29wdGlvbj4nKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGFuZ3VhZ2VTZWxlY3QuYXBwZW5kQ2hpbGQob3B0aW9uRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYobGFuZ3VhZ2VDb3VudCA8PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2xhbmd1YWdlU2VsZWN0V3JhcHBlci5jbGFzc0xpc3QuYWRkKHNlbGYuX2hpZGRlbkNsYXNzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYW5ndWFnZVNlbGVjdFdyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZShzZWxmLl9oaWRkZW5DbGFzcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApLmNhdGNoKFxuICAgICAgICAgICAgLyoqIEBwYXJhbSB7IEVycm9yUmVzcG9uc2UgfSBlcnJvclJlc3BvbnNlICoqL1xuICAgICAgICAgICAgZnVuY3Rpb24oZXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3JSZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9jbGVhckxhbmd1YWdlU2VsZWN0KClcbiAgICB7XG4gICAgICAgIHdoaWxlKHRoaXMuX2xhbmd1YWdlU2VsZWN0LmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5fbGFuZ3VhZ2VTZWxlY3QucmVtb3ZlQ2hpbGQodGhpcy5fbGFuZ3VhZ2VTZWxlY3QuZmlyc3RDaGlsZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tXG4gICAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAgICovXG4gICAgX2NyZWF0ZUh0bWxFbGVtZW50RnJvbVN0cmluZyhmcm9tKVxuICAgIHtcbiAgICAgICAgbGV0IGRvY3VtZW50ID0gdGhpcy5fZG9tUGFyc2VyLnBhcnNlRnJvbVN0cmluZyhmcm9tLCAndGV4dC9odG1sJyk7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5LmZpcnN0Q2hpbGQ7XG4gICAgfVxufVxuXG5leHBvcnQgeyBSZWdpc3RlckNvbnRyb2xsZXIgfSIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gfCBQcmV2ZW50IEJvdHMgaGFuZGxlclxuIHxcbiB8IFdlIG5hbWVkIHRoaXMgY2hvY29sYXRlIGZhY3RvcnkgYW5kIGJlbG9uZ2luZyBjb25mdXNpbmcganMgaG9va3NcbiB8IHRvIHByZXZlbnQgc21hcnQgYm90cyBmcm9tIGJsb2NraW5nIHRoZXNlIHZhcmlhYmxlIG9yIGZ1bmN0aW9ucy5cbiB8XG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuY29uc3QgQ2hvY29sYXRlRmFjdG9yeSA9IHtcblxuICAgIGJhbm5lZFZpc2l0b3I6IFtdLFxuXG4gICAgLyoqIEdldCBhbGwgdGhlIGNob2NvbGF0ZSBmYWN0b3J5IGFuZCBzdGFydFxuICAgICAqICBMb29waW5nIHRocm91Z2ggdGhvc2Ugc3RhcnQgZmxhc2hpbmcgdGlja2V0c1xuICAgICAqL1xuICAgIGVudGVyOiBmdW5jdGlvbigpXG4gICAge1xuXG4gICAgICAgIGNvbnN0IGNob2NvbGF0ZUZhY3RvcmllcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1jaG9jb2xhdGUtZmFjdG9yeScpO1xuXG4gICAgICAgIGlmKGlzc2V0KGNob2NvbGF0ZUZhY3Rvcmllcykpe1xuXG4gICAgICAgICAgICBjb25zdCBhbW91bnRPZkNob2NvbGF0ZUZhY3RvcmllcyA9IGNob2NvbGF0ZUZhY3Rvcmllcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgYW1vdW50T2ZDaG9jb2xhdGVGYWN0b3JpZXM7IGkrKyl7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBDaG9jb2xhdGVCYXIgPSBjaG9jb2xhdGVGYWN0b3JpZXNbaV07XG4gICAgICAgICAgICAgICAgQ2hvY29sYXRlRmFjdG9yeS5fZmxhc2hUaWNrZXQoQ2hvY29sYXRlQmFyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJZiBmYWN0b3J5IGhhcyBhIGdvbGRlbiB0aWNrZXRcbiAgICAgKiBUaGVuIHdlIGNhbiBtYWtlIHRoZW0gZ28gb24gdGhlIHRvdXIgaWYgdGhlcmUgaGFzIGJlZW4gY2xpY2sgb24gdGhlIHRpY2tldFxuICAgICAqXG4gICAgICogQHBhcmFtIGNob2NvbGF0ZUJhclxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2ZsYXNoVGlja2V0OiBmdW5jdGlvbiAoY2hvY29sYXRlQmFyKSB7XG5cbiAgICAgICAgLy8gVHJ5IGdldCB0aGUgdGlja2V0IGZyb20gdGhlIGNob2NvbGF0ZUJhclxuICAgICAgICBjb25zdCBnb2xkZW5UaWNrZXQgPSBjaG9jb2xhdGVCYXIucXVlcnlTZWxlY3RvcignLmpzLWdvbGRlbi10aWNrZXQnKTtcblxuICAgICAgICAvLyBPbmx5IGNvbnRpbnVlIGlmIGNob2NvbGF0ZSBiYXIgaGFzIGEgZ29sZGVuIHRpY2tldFxuICAgICAgICBpZihpc3NldChnb2xkZW5UaWNrZXQpKXtcblxuICAgICAgICAgICAgZ29sZGVuVGlja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIENob2NvbGF0ZUZhY3RvcnkuZW5qb3lUaGVUb3VyKGNob2NvbGF0ZUJhcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1RvIGJhZCwgbm8gZ29sZGVuIHRpY2tldHMgaGFzIGJlZW4gZm91bmQuJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgdGhlIHRvdXIgdGhyb3VnaCB0aGUgZmFjdG9yeVxuICAgICAqIEFuZCBnZXQgdGhlIG5hbWVzIGFuZCBwcm9wZXJ0aWVzIG9mIHRoZSBtZW1iZXJzIG9mIHRoZSBncm91cFxuICAgICAqIElmIHRoZXJlIGFyZSBtZW1iZXJzIGluIHRoZSBncm91cCBvZiBjb3Vyc2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaG9jb2xhdGVGYWN0b3J5XG4gICAgICovXG4gICAgZW5qb3lUaGVUb3VyKGNob2NvbGF0ZUZhY3Rvcnkpe1xuXG4gICAgICAgIC8vIEFzayBmb3IgdGhlIHRvdXIgZ3JvdXBcbiAgICAgICAgY29uc3QgdG91ckdyb3VwID0gY2hvY29sYXRlRmFjdG9yeS5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgdGV4dGFyZWEnKTtcblxuICAgICAgICBpZihpc3NldCh0b3VyR3JvdXApKXtcblxuICAgICAgICAgICAgLy8gRm9yIGVhY2ggdmlzaXRvciB3ZSB3YW50IGEgYmVsb25naW5nIE9vbXBhIExvb21wYVxuICAgICAgICAgICAgbGV0IG9vbXBhTG9vbXBhcyA9IHt9O1xuICAgICAgICAgICAgbGV0IGFtb3VudE9mT29tcGFMb29tcGFzID0gMDtcblxuICAgICAgICAgICAgY29uc3QgdG91ckdyb3VwU2l6ZSA9IHRvdXJHcm91cC5sZW5ndGg7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdG91ckdyb3VwU2l6ZTsgaSsrKXtcblxuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdmlzaXRvciBmcm9tIHRoZSBncm91cFxuICAgICAgICAgICAgICAgIGNvbnN0IHZpc2l0b3IgPSB0b3VyR3JvdXBbaV07XG5cbiAgICAgICAgICAgICAgICAvLyBBc2sgZm9yIGl0cyBuYW1lXG4gICAgICAgICAgICAgICAgY29uc3QgdmlzaXRvck5hbWUgPSB2aXNpdG9yLmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZpc2l0b3IgaXMgYmFubmVkXG4gICAgICAgICAgICAgICAgaWYoIENob2NvbGF0ZUZhY3RvcnkuX2lzVmlzaXRvckJhbm5lZCh2aXNpdG9yTmFtZSkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgb29tcGFMb29tcGFzWyB2aXNpdG9yTmFtZSBdID0gQ2hvY29sYXRlRmFjdG9yeS5fZ2V0QXJyYW5nZW1lbnQodmlzaXRvcik7XG4gICAgICAgICAgICAgICAgYW1vdW50T2ZPb21wYUxvb21wYXMrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGluc3VyYW5jZSB0aGF0IHRoZXJlIGFyZSBvb21wYSBsb29tcGFzXG4gICAgICAgICAgICBpZihhbW91bnRPZk9vbXBhTG9vbXBhcyA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHN1Ym1pdCByZXF1ZXN0XG4gICAgICAgICAgICBDaG9jb2xhdGVGYWN0b3J5Ll9maW5pc2hUb3VyKG9vbXBhTG9vbXBhcywgY2hvY29sYXRlRmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdUbyBiYWQsIG5vIG1lbWJlcnMgdG8gdmlzaXQgdGhpcyBmYWN0b3J5JylcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgdmlzaXRvciBuYW1lIGlzbid0IGFsbG93XG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmlzaXRvck5hbWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9pc1Zpc2l0b3JCYW5uZWQ6IGZ1bmN0aW9uKHZpc2l0b3JOYW1lKXtcbiAgICAgICAgaWYoQ2hvY29sYXRlRmFjdG9yeS5iYW5uZWRWaXNpdG9yLmluZGV4T2YodmlzaXRvck5hbWUpICE9PSAtMSl7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE1vc3QgZ2V0IHZpc2l0b3IgaGF2ZSBhIG5vcm1hbCBhcnJhbmdlbWVudFxuICAgICAqIEJ1dCBzb21ldGltZXMgdGhlcmUgYXJlIHNwZWNpYWwgY2FzZXNcbiAgICAgKiBMaWtlIGEgU2VsZWN0b3Igb3IgY2hlY2tib3hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2aXNpdG9yXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZ2V0QXJyYW5nZW1lbnQ6IGZ1bmN0aW9uKHZpc2l0b3IpXG4gICAge1xuXG4gICAgICAgIGNvbnN0IHZpc2l0b3JUeXBlID0gdmlzaXRvci5ub2RlTmFtZTtcblxuICAgICAgICBzd2l0Y2ggKHZpc2l0b3JUeXBlKSB7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZhbHVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmlzaCB0aGUgdG91clxuICAgICAqIElmIHN1Y2Nlc3NmdWwgc2hvdyB0aGFua3MgbWVzc2FnZVxuICAgICAqIE9yIHNob3cgZGVmaW5lZCBlcnJvciBtZXNzYWdlIG9yIGZhbGxiYWNrXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXBcbiAgICAgKiBAcGFyYW0gY2hvY29sYXRlRmFjdG9yeVxuICAgICAqIEByZXR1cm5zIHsqfHZvaWR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZmluaXNoVG91cjogZnVuY3Rpb24oZ3JvdXAsIGNob2NvbGF0ZUZhY3RvcnkpXG4gICAge1xuICAgICAgICAvLyBBZGQgd2lsbGllIHRvIHRoZSBncm91cFxuICAgICAgICBncm91cCA9IENob2NvbGF0ZUZhY3RvcnkuX2FkZFdpbGxpZVdvbmthKGdyb3VwKTtcblxuICAgICAgICAvLyBHZXQgdGhlIGdhdGUgZm9yIGZpbmlzaCB0aGUgdG91clxuICAgICAgICBjb25zdCBnYXRlID0gJy9jb250YWN0L3Byb2Nlc3MnO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBBamF4LnBvc3QoZ2F0ZSwgZ3JvdXAsIGZ1bmN0aW9uIChIdHRwUmVxdWVzdCkge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKEh0dHBSZXF1ZXN0LnJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAoSHR0cFJlcXVlc3Quc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENob2NvbGF0ZUZhY3RvcnkuX3RoYW5rc0ZvclZpc2l0aW5nKHJlc3BvbnNlLnJlZGlyZWN0VXJsKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2hvY29sYXRlRmFjdG9yeS5fZ2l2ZUZlZWRiYWNrVG9NZW1iZXJzKHJlc3BvbnNlLmVycm9ycywgY2hvY29sYXRlRmFjdG9yeSk7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gQ2hvY29sYXRlRmFjdG9yeS5fdW5rbm93bkdhcEluRmFjdG9yeShjaG9jb2xhdGVGYWN0b3J5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gQ2hvY29sYXRlRmFjdG9yeS5fdW5rbm93bkdhcEluRmFjdG9yeShjaG9jb2xhdGVGYWN0b3J5KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgd2lsbGllIHdvbmthIHRvIHRoZSBncm91cFxuICAgICAqIFBzLi4uIGl0IGFjdHVhbGx5IHRoZSBzZWNyZXQgY29kZSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBncm91cFxuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2FkZFdpbGxpZVdvbmthOiBmdW5jdGlvbihncm91cCl7XG4gICAgICAgIGdyb3VwLl93aWxsaWUgPSAnd29ua2EnO1xuICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCB0aGUgZmVlZGJhY2sgdG8gdGhlIGRlc2lyZWQgYXJlYS5cbiAgICAgKiBNb3N0IGxpa2VseSB0byB0aGUgdmlzaXRvciBkaXJlY3RseSwgYnV0IHNvbWV0aW1lIHRvIHRoZSBmYWN0b3J5IGRlc2lyZWQgZmVlZGJhY2sgYXJlYVxuICAgICAqXG4gICAgICogQHBhcmFtIGVycm9yc1xuICAgICAqIEBwYXJhbSBjaG9jb2xhdGVGYWN0b3J5XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZ2l2ZUZlZWRiYWNrVG9NZW1iZXJzOiBmdW5jdGlvbihlcnJvcnMsIGNob2NvbGF0ZUZhY3Rvcnkpe1xuXG4gICAgICAgIC8vIEdyYWIgdGhlIGZhY3RvcnkgZmVlZGJhY2sgYXJlYVxuICAgICAgICBjb25zdCBmZWVkYmFja0FyZWEgPSBjaG9jb2xhdGVGYWN0b3J5LnF1ZXJ5U2VsZWN0b3IoJy5qcy1lcnJvci1hcmVhJyk7XG5cbiAgICAgICAgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgaHRtbFxuICAgICAgICBpZihpc3NldChmZWVkYmFja0FyZWEpKSBmZWVkYmFja0FyZWEuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgLy8gQ2xlYXIgdGhlIHByZXZpb3VzIG1hcmtlZCBqYWNrZXRzXG4gICAgICAgIENob2NvbGF0ZUZhY3RvcnkuX2NsZWFyUHJldmlvdXNNYXJrZWRKYWNrZXRzKGNob2NvbGF0ZUZhY3RvcnkpO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGVycm9ycykuZm9yRWFjaChmdW5jdGlvbih2aXNpdG9yKSB7XG5cbiAgICAgICAgICAgIGxldCBqYWNrZXQgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHZpc2l0b3JGZWVkYmFja0FyZWEgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBIb25leSBlbGVtZW50cyBkb2Vzbid0IGhhcyBhIGFjY2Vzc2libGUgZWxlbWVudFxuICAgICAgICAgICAgaWYodmlzaXRvciAhPT0gJ19ob25leScgJiYgdmlzaXRvciAhPT0gJ19zZWNyZXRDb2RlJykge1xuXG4gICAgICAgICAgICAgICAgLy8gR3JhYiB0aGUgdmlzaXRvclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpc2l0b3JOb2RlID0gY2hvY29sYXRlRmFjdG9yeS5xdWVyeVNlbGVjdG9yKCcjJyArIHZpc2l0b3IpO1xuXG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgamFja2V0IG9mIGEgdmlzaXRvclxuICAgICAgICAgICAgICAgIGphY2tldCA9IENob2NvbGF0ZUZhY3RvcnkuX2dyYWJWaXNpdG9ySmFja2V0KHZpc2l0b3JOb2RlKTtcblxuICAgICAgICAgICAgICAgIC8vIElmIGZvdW5kIGdldCB0aGUgZGVzaXJlZCBhcmVhXG4gICAgICAgICAgICAgICAgaWYoaXNzZXQoamFja2V0KSkgdmlzaXRvckZlZWRiYWNrQXJlYSA9IGphY2tldC5xdWVyeVNlbGVjdG9yKCcuanMtZm9ybS1lbGVtZW50LWVycm9yJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgY3VycmVudCBodG1sXG4gICAgICAgICAgICAgICAgaWYoaXNzZXQodmlzaXRvckZlZWRiYWNrQXJlYSkpIHZpc2l0b3JGZWVkYmFja0FyZWEuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBmZWVkYmFjayBmb3IgdGhpcyB2aXNpdG9yXG4gICAgICAgICAgICBjb25zdCB2aXNpdG9yRmVlZGJhY2sgPSBlcnJvcnNbdmlzaXRvcl07XG5cbiAgICAgICAgICAgIC8vIFNwaXQgb3V0IGVhY2ggbGluZVxuICAgICAgICAgICAgY29uc3QgdmlzaXRvckZlZWRiYWNrQW1vdW50ID0gdmlzaXRvckZlZWRiYWNrLmxlbmd0aDtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB2aXNpdG9yRmVlZGJhY2tBbW91bnQ7IGkrKyl7XG4gICAgICAgICAgICAgICAgY29uc3QgdmlzaXRvckZlZWRiYWNrTGluZSA9IHZpc2l0b3JGZWVkYmFja1tpXTtcblxuICAgICAgICAgICAgICAgIC8vIEhvbmV5IGVsZW1lbnRzIGRvZXNuJ3QgaGFzIGEgYWNjZXNzaWJsZSBlbGVtZW50IGFyZWFcbiAgICAgICAgICAgICAgICBpZih2aXNpdG9yICE9PSAnX2hvbmV5JyAmJiB2aXNpdG9yICE9PSAnX3NlY3JldENvZGUnKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTWFyayB0aGUgamFja2V0XG4gICAgICAgICAgICAgICAgICAgIGlmKGlzc2V0KGphY2tldCkpIGphY2tldC5jbGFzc0xpc3QuYWRkKCdoYXMtZXJyb3InKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgZmVlZGJhY2sgdG8gdmlzaXRvciBmZWVkYmFjayBhcmVhIGlmIGRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgaWYoaXNzZXQodmlzaXRvckZlZWRiYWNrQXJlYSkpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50RmVlZGJhY2tBcmVhID0gdmlzaXRvckZlZWRiYWNrQXJlYS5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmVlZGJhY2tBcmVhICs9ICc8c3Bhbj4nICsgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHZpc2l0b3JGZWVkYmFja0xpbmUpICsgJzwvc3Bhbj4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlzaXRvckZlZWRiYWNrQXJlYS5pbm5lckhUTUwgPSBjdXJyZW50RmVlZGJhY2tBcmVhO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQXBwZW5kIGZlZWRiYWNrIHRvIGZhY3RvcnkgZmVlZGJhY2sgYXJlYSBpZiBkZWZpbmVkXG4gICAgICAgICAgICAgICAgaWYoaXNzZXQoZmVlZGJhY2tBcmVhKSl7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50RmVlZGJhY2tBcmVhID0gZmVlZGJhY2tBcmVhLmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEZlZWRiYWNrQXJlYSArPSAnPGxpPicgKyBjYXBpdGFsaXplRmlyc3RMZXR0ZXIodmlzaXRvckZlZWRiYWNrTGluZSkgKyAnPC9saT4nO1xuICAgICAgICAgICAgICAgICAgICBmZWVkYmFja0FyZWEuaW5uZXJIVE1MID0gY3VycmVudEZlZWRiYWNrQXJlYTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGUgcHJldmlvdXMgbWFya2VkIGphY2tldHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaG9jb2xhdGVGYWN0b3J5XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfY2xlYXJQcmV2aW91c01hcmtlZEphY2tldHMoY2hvY29sYXRlRmFjdG9yeSkge1xuXG4gICAgICAgIGNvbnN0IG1hcmtlZEphY2tldHMgPSBjaG9jb2xhdGVGYWN0b3J5LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oYXMtZXJyb3InKTtcbiAgICAgICAgY29uc3QgbWFya2VkSmFja2V0c0Ftb3VudCA9IG1hcmtlZEphY2tldHMubGVuZ3RoO1xuXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBtYXJrZWRKYWNrZXRzQW1vdW50OyBpKyspe1xuICAgICAgICAgICAgbWFya2VkSmFja2V0c1tpXS5jbGFzc0xpc3QucmVtb3ZlKCdoYXMtZXJyb3InKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHcmFiIHRoZSBqYWNrZXQgb2YgdGhlIHZpc2l0b3JcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2aXNpdG9yXG4gICAgICogQHJldHVybnMge251bGx8KnwoKCkgPT4gKE5vZGUgfCBudWxsKSl8QWN0aXZlWC5JWE1MRE9NTm9kZXwoTm9kZSAmIFBhcmVudE5vZGUpfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dyYWJWaXNpdG9ySmFja2V0OiBmdW5jdGlvbih2aXNpdG9yKXtcblxuICAgICAgICAvLyBDaGVjayBpZiB2aXNpdG9yIGlzIGRlZmluZWRcbiAgICAgICAgaWYgKCFpc3NldCh2aXNpdG9yKSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gRG8gbG9vcCBzZXR0aW5nc1xuICAgICAgICBjdXJyZW50TGF5ZXIgPSB2aXNpdG9yO1xuICAgICAgICBzYWZldHlCcmVhayA9IDA7XG5cbiAgICAgICAgLy8gR3JhYiB0aGUgbmV4dCBsYXllciB0aWxsIGl0IGlzIHRoZSBqYWNrZXQgKG9yIHNhZmV0eUJyZWFrIGhhcyBiZWVuIHJlYWNoZWRcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgc2FmZXR5QnJlYWsrKztcbiAgICAgICAgICAgIGN1cnJlbnRMYXllciA9IGN1cnJlbnRMYXllci5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYoY3VycmVudExheWVyLmNsYXNzTGlzdC5jb250YWlucygnanMtZm9ybS1lbGVtZW50JykpIHJldHVybiBjdXJyZW50TGF5ZXI7XG4gICAgICAgIH0gd2hpbGUgKGN1cnJlbnRMYXllci50YWdOYW1lICE9PSAnQk9EWScgJiYgc2FmZXR5QnJlYWsgPD0gMTApO1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZWRpcmVjdCB0aGUgdmlzaXRvciB0byB0aGUgdGhhbmtzIHBhZ2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZXh0U3RvcFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3RoYW5rc0ZvclZpc2l0aW5nOiBmdW5jdGlvbiAobmV4dFN0b3ApIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gbmV4dFN0b3A7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVua25vd24gZXJyb3Igb2NjdXJyZWQsIGxvZyB0aGUgZXJyb3JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaG9jb2xhdGVGYWN0b3J5XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdW5rbm93bkdhcEluRmFjdG9yeTogZnVuY3Rpb24gKGNob2NvbGF0ZUZhY3RvcnkpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hvY29sYXRlRmFjdG9yeSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaG9jb2xhdGVGYWN0b3J5OiBVbmtvd24gRXJyb3InKTtcbiAgICB9LFxufTtcblxuQ2hvY29sYXRlRmFjdG9yeS5lbnRlcigpOyIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBDb29raWUgaGFuZGxlclxuICAgLSBQcmltYXJ5IHVzYWdlIGZvciB0b2dnbGluZyB0aGUgY29va2llIG1lc3NhZ2UgYW5kL29yIHN3aXRjaFxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IENvb2tpZUhhbmRsZXIgPSB7XG5cbiAgICBjb29raWVCYXIgOiBudWxsLFxuICAgIGNvb2tpZU92ZXJsYXkgOiBudWxsLFxuICAgIGNvb2tpZU1lc3NhZ2UgOiBudWxsLFxuXG4gICAgY29va2llU3dpdGNoIDogbnVsbCxcblxuICAgIGNvb2tpZUZhZGVPdXRBbmltYXRpb25EdXJhdGlvbiA6IDQwMCxcbiAgICBhY2NlcHRUcmFja2luZyA6IGZhbHNlLFxuXG4gICAgLy8gSW5pdGlhbGl6ZSBjb29raWUgaGFuZGxlclxuICAgIGluaXQgOiBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICAvLyBCaW5kIGNvb2tpZSBiYXIgb3Igb3ZlcmxheSB0byBjb29raWVNZXNzYWdlXG4gICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llTWVzc2FnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jb29raWUtYmFyLCAuanMtY29va2llLW92ZXJsYXknKTtcblxuICAgICAgICAvLyBCaW5kIGNvb2tpZSBiYXIgdG8gY29va2llQmFyXG4gICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llQmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWNvb2tpZS1iYXInKTtcblxuICAgICAgICAvLyBJZiBpc3NldCBpbml0IHRoZSBmdW5jdGlvbnMgZm9yIGNvb2tpZSBiYXJcbiAgICAgICAgaWYoaXNzZXQoQ29va2llSGFuZGxlci5jb29raWVCYXIpKXtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuaW5pdENvb2tpZUJhcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICAvLyBFbHNlIHRyeSB0byBjb25uZWN0IGNvb2tpZSBvdmVybGF5IHdpdGggdHJhY2tpbmcgdG8gY29va2llT3ZlcmxheVxuICAgICAgICAgICAgQ29va2llSGFuZGxlci5jb29raWVPdmVybGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWNvb2tpZS1vdmVybGF5Jyk7XG5cbiAgICAgICAgICAgIC8vIElmIGlzc2V0IGluaXQgdGhlIGZ1bmN0aW9ucyBmb3IgY29va2llIG92ZXJsYXlcbiAgICAgICAgICAgIGlmKGlzc2V0KENvb2tpZUhhbmRsZXIuY29va2llT3ZlcmxheSkpe1xuICAgICAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuaW5pdENvb2tpZU92ZXJsYXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGVpdGhlciB0eXBlIG9mIGNvb2tpZSBoYXMgYmVlbiBmb3VuZCBjaGVjayBpZiBzZXR0aW5ncyBhcmUgZGVmaW5lZFxuICAgICAgICBpZihpc3NldChDb29raWVIYW5kbGVyLmNvb2tpZU1lc3NhZ2UpKXtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuY2hlY2tGb3JDb29raWVTZXR0aW5ncygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmluZCBjb29raWUgc3dpdGNoIHRvIEhhbmRsZXJcbiAgICAgICAgQ29va2llSGFuZGxlci5jb29raWVTd2l0Y2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtY29va2llLXN3aXRjaCcpO1xuICAgICAgICAvLyBJZiBpc3NldCBpbml0IHRoZSBmdW5jdGlvbnMgZm9yIGNvb2tpZSBzd2l0Y2hcbiAgICAgICAgaWYoaXNzZXQoQ29va2llSGFuZGxlci5jb29raWVTd2l0Y2gpKXtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuaW5pdENvb2tpZVN3aXRjaCgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEluaXQgdGhlIGNvb2tpZSBiYXIgYWN0aW9uc1xuICAgIGluaXRDb29raWVCYXI6IGZ1bmN0aW9uKCl7XG4gICAgICAgIGNvbnN0IGNsb3NlQnV0dG9uID0gQ29va2llSGFuZGxlci5jb29raWVCYXIucXVlcnlTZWxlY3RvcignLmpzLWRpc2FibGUtY29va2llLWJhcicpO1xuICAgICAgICBpZihpc3NldChjbG9zZUJ1dHRvbikpe1xuICAgICAgICAgICAgY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBDb29raWVIYW5kbGVyLmNsb3NlQ29va2llTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gSW5pdCB0aGUgY29va2llIG92ZXJsYXkgYWN0aW9uc1xuICAgIGluaXRDb29raWVPdmVybGF5OiBmdW5jdGlvbigpe1xuXG4gICAgICAgIC8vIE9wZW4gdGhlIGNvb2tpZSBzZXR0aW5ncyBldmVudFxuICAgICAgICBjb25zdCBvcGVuQ29va2llU2V0dGluZ3NCdXR0b24gPSBDb29raWVIYW5kbGVyLmNvb2tpZU1lc3NhZ2UucXVlcnlTZWxlY3RvcignLmpzLWNoYW5nZS1jb29raWVzLXNldHRpbmdzJyk7XG4gICAgICAgIGlmKGlzc2V0KG9wZW5Db29raWVTZXR0aW5nc0J1dHRvbikpe1xuICAgICAgICAgICAgb3BlbkNvb2tpZVNldHRpbmdzQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgQ29va2llSGFuZGxlci5vcGVuQ29va2llU2V0dGluZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVG9nZ2xlIG9mIHRoZSB0cmFja2luZyBpbnB1dFxuICAgICAgICBjb25zdCB0b2dnbGVUcmFja2luZ0lucHV0ID0gQ29va2llSGFuZGxlci5jb29raWVNZXNzYWdlLnF1ZXJ5U2VsZWN0b3IoJy5jLWNvb2tpZS10eXBlX19pbnB1dC0tdHJhY2tpbmcnKTtcbiAgICAgICAgaWYoaXNzZXQodG9nZ2xlVHJhY2tpbmdJbnB1dCkpe1xuXG4gICAgICAgICAgICBpZih0b2dnbGVUcmFja2luZ0lucHV0LmNoZWNrZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBDb29raWVIYW5kbGVyLmFjY2VwdFRyYWNraW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdG9nZ2xlVHJhY2tpbmdJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBDb29raWVIYW5kbGVyLnRvZ2dsZVRyYWNraW5nU2V0dGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBY2NlcHQgLyBTYXZlIGNvb2tpZXMgYnV0dG9uIGV2ZW50XG4gICAgICAgIGNvbnN0IGFjY2VwdEJ1dHRvbiA9IENvb2tpZUhhbmRsZXIuY29va2llTWVzc2FnZS5xdWVyeVNlbGVjdG9yKCcuanMtYWNjZXB0LWNvb2tpZXMnKTtcbiAgICAgICAgaWYoaXNzZXQoYWNjZXB0QnV0dG9uKSl7XG4gICAgICAgICAgICBhY2NlcHRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBDb29raWVIYW5kbGVyLnNldENvb2tpZVNldHRpbmdzKTtcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8vIEluaXQgdGhlIGNvb2tpZSBzd2l0Y2ggYWN0aW9uc1xuICAgIGluaXRDb29raWVTd2l0Y2g6IGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgLy8gVG9nZ2xlIG9mIHRoZSB0cmFja2luZyBpbnB1dFxuICAgICAgICBjb25zdCB0b2dnbGVUcmFja2luZ0lucHV0ID0gQ29va2llSGFuZGxlci5jb29raWVTd2l0Y2gucXVlcnlTZWxlY3RvcignLmMtY29va2llLXR5cGVfX2lucHV0LS10cmFja2luZycpO1xuICAgICAgICBpZihpc3NldCh0b2dnbGVUcmFja2luZ0lucHV0KSl7XG5cbiAgICAgICAgICAgIC8vIEZvcmNlIHRoZSBzdGF0ZSBvZiB0aGUgY29va2llIHN3aXRjaCBpbnB1dCBiZWNhdXNlIHRoZSBwb3AtdXAgaXMgZm9yY2VkIG9uIGNoZWNrZWRcbiAgICAgICAgICAgIC8vIHdoaWxlIHRoZSBzd2l0Y2ggY2hlY2tzIGJ5IHBocCBpZiB0aGUgY29va2llIHJlYWxseSBleGlzdCBvciBub3RcbiAgICAgICAgICAgIGlmKHRvZ2dsZVRyYWNraW5nSW5wdXQuY2hlY2tlZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuYWNjZXB0VHJhY2tpbmcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBDb29raWVIYW5kbGVyLmFjY2VwdFRyYWNraW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRvZ2dsZVRyYWNraW5nSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgQ29va2llSGFuZGxlci50b2dnbGVUcmFja2luZ1NldHRpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2F2ZSBjb29raWVzIGJ1dHRvbiBldmVudFxuICAgICAgICBjb25zdCBzYXZlQnV0dG9uID0gQ29va2llSGFuZGxlci5jb29raWVTd2l0Y2gucXVlcnlTZWxlY3RvcignLmpzLXNhdmUtY29va2llLXNldHRpbmdzJyk7XG4gICAgICAgIGlmKGlzc2V0KHNhdmVCdXR0b24pKXtcbiAgICAgICAgICAgIHNhdmVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llRmFkZU91dEFuaW1hdGlvbkR1cmF0aW9uID0gMDsgLy8gT24gdGhlIHN3aXRjaCBjbGljayB3ZSB3YW50IG5vIGRlbGF5IDopXG4gICAgICAgICAgICAgICAgQ29va2llSGFuZGxlci5zZXRDb29raWVTZXR0aW5ncygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgIH0sXG5cbiAgICBjaGVja0ZvckNvb2tpZVNldHRpbmdzOiBmdW5jdGlvbigpe1xuICAgICAgICBpZiAoQ29va2llLmdldCgnY29va2llTWVzc2FnZScpKSB7XG4gICAgICAgICAgICBDb29raWVIYW5kbGVyLmNvb2tpZU1lc3NhZ2UuY2xhc3NMaXN0LmFkZCgnaXMtYWNjZXB0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llTWVzc2FnZS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY2NlcHRlZCcpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdpcy1jb29raWUtYmFyLXZpc2libGUnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjbG9zZUNvb2tpZU1lc3NhZ2U6IGZ1bmN0aW9uICgpe1xuICAgICAgICBDb29raWUuc2V0KCdjb29raWVNZXNzYWdlJywgdHJ1ZSwgOTApO1xuICAgICAgICBDb29raWVIYW5kbGVyLmNvb2tpZU1lc3NhZ2UuY2xhc3NMaXN0LmFkZCgnaXMtdHJhbnNpdGlvbmluZy1vdXQnKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1jb29raWUtYmFyLXZpc2libGUnKTtcbiAgICB9LFxuXG4gICAgb3BlbkNvb2tpZVNldHRpbmdzOiBmdW5jdGlvbiAoKXtcbiAgICAgICAgQ29va2llSGFuZGxlci5jb29raWVPdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jb29raWUtc2V0dGluZ3MnKS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1oaWRkZW4nKTtcbiAgICAgICAgQ29va2llSGFuZGxlci5jb29raWVPdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jb29raWUtaW5mbycpLmNsYXNzTGlzdC5hZGQoJ2lzLWhpZGRlbicpO1xuICAgIH0sXG5cbiAgICB0b2dnbGVUcmFja2luZ1NldHRpbmc6IGZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKENvb2tpZUhhbmRsZXIuYWNjZXB0VHJhY2tpbmcpe1xuICAgICAgICAgICAgQ29va2llSGFuZGxlci5hY2NlcHRUcmFja2luZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBDb29raWVIYW5kbGVyLmFjY2VwdFRyYWNraW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRDb29raWVTZXR0aW5nczogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIC8vIFNldCB0cmFja2luZyBjb29raWUgb3IgZGVsZXRlIGl0IGlmIGlzc2V0IGFjY29yZGluZyB0byB0aGUgZGVzaXJlZCBzZXR0aW5nc1xuICAgICAgICBpZihDb29raWVIYW5kbGVyLmFjY2VwdFRyYWNraW5nKXtcbiAgICAgICAgICAgIENvb2tpZS5zZXQoJ3RyYWNraW5nQ29va2llQWNjZXB0ZWQnLCAndHJ1ZScsIDkwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgICAgaWYoQ29va2llLmdldCgndHJhY2tpbmdDb29raWVBY2NlcHRlZCcpKXtcbiAgICAgICAgICAgICAgICBDb29raWUuZXJhc2UoJ3RyYWNraW5nQ29va2llQWNjZXB0ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIENvb2tpZUhhbmRsZXIuY2xvc2VDb29raWVNZXNzYWdlKCk7XG5cbiAgICAgICAgLy8gUmVsb2FkIGFmdGVyIGFuaW1hdGlvbiB0byBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHRyYWNraW5nIGFmdGVyIGFjY2VwdGluZyBpdFxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgICB9LCBDb29raWVIYW5kbGVyLmNvb2tpZUZhZGVPdXRBbmltYXRpb25EdXJhdGlvbik7XG4gICAgfSxcblxufTtcblxuQ29va2llSGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBHb29nbGUgTWFwcyBoYW5kbGVyXG4gICAgLSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vamF2YXNjcmlwdC9hZGRpbmctYS1nb29nbGUtbWFwXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuY29uc3QgTWFwc0hhbmRsZXIgPSB7XG5cbiAgICBtYXBzOiBbXSxcbiAgICBrZXk6ICcnLFxuXG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIC8vIEdldCBtYXAgZWxlbWVudHNcbiAgICAgICAgY29uc3QgbWFwcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1nb29nbGUtbWFwJyk7XG5cbiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG1hcCBlbGVtZW50cyBsb29wIHRocm91Z2ggdGhlbSBhbmQgZHJhdyB0aGUgbWFwc1xuICAgICAgICBpZihtYXBzLmxlbmd0aCAhPT0gMCApIHtcblxuICAgICAgICAgICAgLy8gQ29udmVydCBlbGVtZW50cyBpbnRvIG9iamVjdCBmb3IgY2FsbGJhY2sgd2hlbiBzY3JpcHQgYXMgYmVlbiBsb2FkZWRcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBtYXBzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBHZXQgbWFwIGZyb20gbm9kZUxpc3RcbiAgICAgICAgICAgICAgICBjb25zdCBtYXAgPSBtYXBzW2ldO1xuXG4gICAgICAgICAgICAgICAgaWYoIW1hcC5oYXNBdHRyaWJ1dGUoJ2RhdGEtZ29vZ2xlLWxhdCcpIHx8ICFtYXAuaGFzQXR0cmlidXRlKCdkYXRhLWdvb2dsZS1sbmcnKSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBsZXQgbGF0ID0gcGFyc2VGbG9hdChtYXAuZ2V0QXR0cmlidXRlKCdkYXRhLWdvb2dsZS1sYXQnKSk7XG4gICAgICAgICAgICAgICAgbGV0IGxuZyA9IHBhcnNlRmxvYXQobWFwLmdldEF0dHJpYnV0ZSgnZGF0YS1nb29nbGUtbG5nJykpO1xuXG4gICAgICAgICAgICAgICAgTWFwc0hhbmRsZXIubWFwcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZTogbWFwLFxuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF0OiBsYXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsbmc6IGxuZyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBNYXBzSGFuZGxlci5zZXRDdXN0b21TdHlsaW5nKClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2VlIGlmIGdvb2dsZSB2YXJpYWJsZSBleGlzdHNcbiAgICAgICAgICAgIGlmICh0eXBlb2YoZ29vZ2xlKSA9PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YoZ29vZ2xlLm1hcHMpID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9hZCBleHRlcm5hbCBzY3JpcHQgd2l0aCBkcmF3TWFwcyBjYWxsYmFja1xuICAgICAgICAgICAgICAgIGdldFNjcmlwdCgnaHR0cHM6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2pzP2tleT0nICsgTWFwc0hhbmRsZXIua2V5LCBNYXBzSGFuZGxlci5kcmF3TWFwcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIElmIGFscmVhZHkgbG9hZGVkIGRyYXcgbWFwc1xuICAgICAgICAgICAgICAgIE1hcHNIYW5kbGVyLmRyYXdNYXBzKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEcmF3IHRoZSBnb29nbGUgbWFwc1xuICAgICAqL1xuICAgIGRyYXdNYXBzOiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXBzSGFuZGxlci5tYXBzLmxlbmd0aDsgaSsrKSAge1xuXG4gICAgICAgICAgICBjb25zdCBtYXAgPSBNYXBzSGFuZGxlci5tYXBzW2ldO1xuXG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBtYXBcbiAgICAgICAgICAgIGNvbnN0IGdvb2dsZU1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAobWFwLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB6b29tOiAxMSxcbiAgICAgICAgICAgICAgICBjZW50ZXI6IG1hcC5sb2NhdGlvbixcbiAgICAgICAgICAgICAgICBkaXNhYmxlRGVmYXVsdFVJOiB0cnVlLFxuICAgICAgICAgICAgICAgIHN0eWxlczogbWFwLnN0eWxlc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIEFkZCBhIG1hcmtlclxuICAgICAgICAgICAgY29uc3QgbWFya2VyID0gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IG1hcC5sb2NhdGlvbixcbiAgICAgICAgICAgICAgICBtYXA6IGdvb2dsZU1hcFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBjdXN0b20gc3R5bGluZyBmb3IgdGhlIEdvb2dsZSBNYXBzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7KltdfVxuICAgICAqL1xuICAgIHNldEN1c3RvbVN0eWxpbmc6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInBvaVwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwibGFiZWxzLnRleHQuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjNzQ3NDc0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogXCIyM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInBvaS5hdHRyYWN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmMzhlYjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJwb2kuZ292ZXJubWVudFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjY2VkN2RiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicG9pLm1lZGljYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2ZmYTVhOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInBvaS5wYXJrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNjN2U1YzhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJwb2kucGxhY2Vfb2Zfd29yc2hpcFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjZDZjYmM3XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicG9pLnNjaG9vbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjYzRjOWU4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicG9pLnNwb3J0c19jb21wbGV4XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNiMWVhZjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeVwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IFwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwibGFiZWxzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2aXNpYmlsaXR5XCI6IFwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogXCIxMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmhpZ2h3YXlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2ZmZDRhNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInJvYWQuYXJ0ZXJpYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2ZmZTlkMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInJvYWQubG9jYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImFsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidmlzaWJpbGl0eVwiOiBcInNpbXBsaWZpZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmxvY2FsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ3ZWlnaHRcIjogXCIzLjAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZC5sb2NhbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuc3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ3ZWlnaHRcIjogXCIwLjMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZC5sb2NhbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwibGFiZWxzLnRleHRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZpc2liaWxpdHlcIjogXCJvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInJvYWQubG9jYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImxhYmVscy50ZXh0LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiIzc0NzQ3NFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IFwiMzZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmxvY2FsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJsYWJlbHMudGV4dC5zdHJva2VcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2U5ZTVkY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IFwiMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJ0cmFuc2l0LmxpbmVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2aXNpYmlsaXR5XCI6IFwib25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiBcIjEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcIndhdGVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJhbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2QyZTdmN1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdO1xuICAgIH1cbn07XG5cbk1hcHNIYW5kbGVyLmluaXQoKTsiLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgTmF2aWdhdGlvbiBoYW5kbGVyXG4gICAtIEhhbmRsZXMgdGhlIHNob3dpbmcgYW5kIGhpZGluZyBvZiB0aGUgb3ZlcmxheS1tZW51IGNvbXBvbmVudCB3aGljaCBoYXMgdGhlIHByb3BlciBjbGFzc2VzLlxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IGJvZHlTY3JvbGxMb2NrID0gcmVxdWlyZSgnYm9keS1zY3JvbGwtbG9jaycpO1xuXG5jb25zdCBPdmVybGF5TWVudUhhbmRsZXIgPSB7XG5cbiAgICAvLyBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gICAgIGNvbnN0IG92ZXJsYXlNZW51VHJpZ2dlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1vdmVybGF5LW1lbnUtdHJpZ2dlcicpO1xuICAgIC8vICAgICBPdmVybGF5TWVudUhhbmRsZXIuaW5pdE92ZXJsYXlNZW51KG92ZXJsYXlNZW51VHJpZ2dlcik7XG4gICAgLy8gfSxcblxuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBjb25zdCBvdmVybGF5TWVudVRyaWdnZXJMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLW92ZXJsYXktbWVudS10cmlnZ2VyJyk7XG4gICAgICAgIGNvbnN0IG92ZXJsYXlNZW51VHJpZ2dlckxpc3RDb3VudCA9IG92ZXJsYXlNZW51VHJpZ2dlckxpc3QubGVuZ3RoO1xuXG4gICAgICAgIGlmKGlzc2V0KG92ZXJsYXlNZW51VHJpZ2dlckxpc3QpICYmIG92ZXJsYXlNZW51VHJpZ2dlckxpc3RDb3VudCAhPT0gMCl7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgb3ZlcmxheU1lbnVUcmlnZ2VyTGlzdENvdW50OyBpKyspe1xuICAgICAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlNZW51VHJpZ2dlciA9IG92ZXJsYXlNZW51VHJpZ2dlckxpc3RbaV07XG4gICAgICAgICAgICAgICAgT3ZlcmxheU1lbnVIYW5kbGVyLmluaXRPdmVybGF5TWVudShvdmVybGF5TWVudVRyaWdnZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGluaXRPdmVybGF5TWVudTogZnVuY3Rpb24gKG92ZXJsYXlNZW51VHJpZ2dlcikge1xuICAgICAgICBvdmVybGF5TWVudVRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBPdmVybGF5TWVudUhhbmRsZXIudG9nZ2xlT3ZlcmxheU1lbnUsIGZhbHNlKTtcbiAgICB9LFxuXG4gICAgdG9nZ2xlT3ZlcmxheU1lbnU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBjb25zdCBvdmVybGF5TWVudU5hdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1vdmVybGF5LW1lbnUnKTtcbiAgICAgICAgLy8gY29uc3Qgb3ZlcmxheU1lbnVCb2R5ID0gb3ZlcmxheU1lbnUucXVlcnlTZWxlY3RvcignLmpzLW92ZXJsYXktbWVudS1wZXJzaXN0LXNjcm9sbGluZycpO1xuXG4gICAgICAgIC8vIEJhaWwgaWYgb3ZlcmxheU1lbnUgZG9lc24ndCBleGlzdFxuICAgICAgICBpZiAoIW92ZXJsYXlNZW51TmF2KSByZXR1cm47XG5cbiAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXNseSBsb2NrZWQgc2Nyb2xsIG9uIHRoZSBib2R5XG4gICAgICAgIGJvZHlTY3JvbGxMb2NrLmVuYWJsZUJvZHlTY3JvbGwob3ZlcmxheU1lbnVOYXYpO1xuXG4gICAgICAgIC8vIElmIHRoZSBvdmVybGF5TWVudSBpcyBhbHJlYWR5IGFjdGl2ZSwgY29sbGFwc2UgaXQgYW5kIHF1aXRcbiAgICAgICAgaWYgKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1vdmVybGF5LW1lbnUtYWN0aXZlJykpIHtcbiAgICAgICAgICAgIG92ZXJsYXlNZW51TmF2LnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0YWJpbmRleD1cIjBcIl0nKS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgICAgICAgICAgICBlbGVtLnRhYkluZGV4ID0gLTE7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1vdmVybGF5LW1lbnUtYWN0aXZlJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2NrIHNjcm9sbGluZyBvbiB0aGUgYm9keVxuICAgICAgICBib2R5U2Nyb2xsTG9jay5kaXNhYmxlQm9keVNjcm9sbChvdmVybGF5TWVudU5hdik7XG5cbiAgICAgICAgb3ZlcmxheU1lbnVOYXYucXVlcnlTZWxlY3RvckFsbCgnW3RhYmluZGV4PVwiLTFcIl0nKS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgICAgICAgIGVsZW0udGFiSW5kZXggPSAwO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUb2dnbGUgYWN0aXZlIG92ZXJsYXlNZW51IGJ5IHNldHRpbmcgYSBjbGFzcyBvbiB0aGUgYm9keVxuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ2lzLW92ZXJsYXktbWVudS1hY3RpdmUnKTtcbiAgICAgICAgb3ZlcmxheU1lbnVOYXYuaGlkZGVuID0gZmFsc2U7XG4gICAgfVxufTtcblxuT3ZlcmxheU1lbnVIYW5kbGVyLmluaXQoKTsiLCIvKipcbiAqIENyZWF0ZWQgYnkgUGFzY2FsIG9uIDA2LzEyLzE3LlxuICogKE5hbWUgY2hhbmdlcyBieSBSb2Igb24gMTgvMDMvMTgpXG4gKi9cblxuLyogRXhhbXBsZVxuXG5jb25zdCBoZWFkZXJJbWFnZVNsaWRlclNldHRpbmcgPSBuZXcgUHJvamVjdG9yU2V0dGluZyh7XG4gICAgc2xpZGVyUHJvamVjdG9ySWQ6ICdoZWFkZXItaW1hZ2Utc2xpZGVyJyxcbiAgICBzbGlkZVF1ZXJ5OiAnI2hlYWRlci1pbWFnZS1zbGlkZXIgLnBsYWNlaG9sZGVyIGZpZ3VyZScsXG4gICAgZG90czogJyNoZWFkZXItaW1hZ2Utc2xpZGVyIC5zbGlkZXItbmF2aWdhdGlvbi1sYWJlbHMgLm5hdmlnYXRpb24gc3BhbicsXG4gICAgY2FwdGlvbnM6ICcjaGVhZGVyLWltYWdlLXNsaWRlciAuc2xpZGVyLW5hdmlnYXRpb24tbGFiZWxzIC5jYXB0aW9uIHAnLFxuICAgIGF1dG9TbGlkZTogdHJ1ZSxcbiAgICBzbGlkZXJJbnRlcnZhbDogNDAwMFxufSk7XG5oZWFkZXJJbWFnZVNsaWRlclNldHRpbmcgPSBoZWFkZXJJbWFnZVNsaWRlclNldHRpbmcucHJlcGFyZVBhcmFtZXRlcnMoKTtcblxuY29uc3QgaGVhZGVySW1hZ2VTbGlkZXIgPSBuZXcgUHJvamVjdG9yKGhlYWRlckltYWdlU2xpZGVyU2V0dGluZykuaW5pdCgpO1xuXG4gKi9cblxubGV0IHByb2plY3RvcnMgPSBbXTtcblxuY29uc3QgcHJvamVjdG9yQ29udGFpbmVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1wcm9qZWN0b3InKTtcbmNvbnN0IHByb2plY3RvckNvbnRhaW5lcnNMZW5ndGggPSBwcm9qZWN0b3JDb250YWluZXJzLmxlbmd0aDtcblxuZm9yKGxldCBpID0wOyBpIDwgcHJvamVjdG9yQ29udGFpbmVyc0xlbmd0aDsgaSsrKXtcblxuICAgIGNvbnN0IHByb2plY3RvciA9IHByb2plY3RvckNvbnRhaW5lcnNbaV07XG4gICAgY29uc3QgcHJvamVjdG9ySWQgPSBwcm9qZWN0b3IuZ2V0QXR0cmlidXRlKCdpZCcpO1xuXG4gICAgaWYocHJvamVjdG9ySWQgIT09IG51bGwpe1xuXG4gICAgICAgIGNvbnN0IHByb2plY3RvclNldHRpbmcgPSBuZXcgUHJvamVjdG9yU2V0dGluZyh7XG4gICAgICAgICAgICBzbGlkZXJJZDogcHJvamVjdG9ySWQsXG4gICAgICAgICAgICBzbGlkZVF1ZXJ5OiAnIycgKyBwcm9qZWN0b3JJZCArJyAuanMtcHJvamVjdG9yLXNsaWRlJyxcbiAgICAgICAgICAgIG5hdmlnYXRpb25CdXR0b25zOiAnIycgKyBwcm9qZWN0b3JJZCArJyAuanMtcHJvamVjdG9yLWJ1dHRvbicgLFxuICAgICAgICAgICAgZG90czogJyMnICsgcHJvamVjdG9ySWQgKycgLmpzLXByb2plY3Rvci1pbmRpY2F0b3InICxcbiAgICAgICAgICAgIGF1dG9TbGlkZTogdHJ1ZSxcbiAgICAgICAgICAgIHNsaWRlckludGVydmFsOiA0MDAwXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHByb2plY3RvcnMucHVzaCggbmV3IFByb2plY3Rvcihwcm9qZWN0b3JTZXR0aW5nLnByZXBhcmVQYXJhbWV0ZXJzKCkpLmluaXQoKSApO1xuICAgIH1cbiAgICBlbHNlIGNvbnNvbGUubG9nKCdBbiBpbWFnZSBzbGlkZXIgaGFzIG5vIGlkLi4uJyk7XG59XG5cblxuZnVuY3Rpb24gUHJvamVjdG9yU2V0dGluZyhzZXR0aW5nc09iamVjdCkge1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICB0aGlzLnNsaWRlcklkID0gJyc7XG4gICAgdGhpcy5kZWZpbmVkUHJldmlvdXNOZXh0ID0gdHJ1ZTtcbiAgICB0aGlzLmF1dG9TbGlkZSA9IGZhbHNlO1xuICAgIHRoaXMuc2xpZGVySW50ZXJ2YWwgPSA0MDAwO1xuICAgIHRoaXMubmF2aWdhdGlvbkJ1dHRvbnMgPSAnJztcbiAgICB0aGlzLmRvdHMgPSAnJztcbiAgICB0aGlzLmNhcHRpb25zID0gJyc7XG4gICAgdGhpcy5zbGlkZVF1ZXJ5ID0gJyc7XG5cbiAgICB0aGlzLnNldFByb2plY3RvcklkID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICB0aGlzLnNsaWRlcklkID0gc3RyaW5nO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIHRoaXMuc2V0RGVmaW5lZFByZXZpb3VzTmV4dCA9IGZ1bmN0aW9uIChib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lZFByZXZpb3VzTmV4dCA9IGJvb2xlYW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXRBdXRvU2xpZGUgPSBmdW5jdGlvbiAoYm9vbGVhbikge1xuICAgICAgICB0aGlzLmF1dG9TbGlkZSA9IGJvb2xlYW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXRTbGlkZXJJbnRlcnZhbCA9IGZ1bmN0aW9uIChpbnRlZ2VyKSB7XG4gICAgICAgIHRoaXMuc2xpZGVySW50ZXJ2YWwgPSBpbnRlZ2VyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIHRoaXMuc2V0U2xpZGVRdWVyeSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zbGlkZVF1ZXJ5ID0gc3RyaW5nO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIHRoaXMuc2V0TmF2aWdhdGlvbkJ1dHRvbnMgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkJ1dHRvbnMgPSBzdHJpbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXREb3RzID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICB0aGlzLmRvdHMgPSBzdHJpbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXRDYXB0aW9ucyA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jYXB0aW9ucyA9IHN0cmluZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICB0aGlzLmdldFByb2plY3RvcklkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zbGlkZXJJZDtcbiAgICB9O1xuICAgIHRoaXMuZ2V0RGVmaW5lZFByZXZpb3VzTmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmaW5lZFByZXZpb3VzTmV4dDtcbiAgICB9O1xuICAgIHRoaXMuZ2V0QXV0b1NsaWRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdXRvU2xpZGU7XG4gICAgfTtcbiAgICB0aGlzLmdldFNsaWRlckludGVydmFsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zbGlkZXJJbnRlcnZhbDtcbiAgICB9O1xuICAgIHRoaXMuZ2V0U2xpZGVRdWVyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGVRdWVyeTtcbiAgICB9O1xuICAgIHRoaXMuZ2V0TmF2aWdhdGlvbkJ1dHRvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25CdXR0b25zO1xuICAgIH07XG4gICAgdGhpcy5nZXREb3RzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb3RzO1xuICAgIH07XG4gICAgdGhpcy5nZXRDYXB0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FwdGlvbnM7XG4gICAgfTtcblxuXG4gICAgLy8gSW52ZXJ0IHNldHRlcnMgdG8gZ2V0dGVyc1xuICAgIHRoaXMucHJlcGFyZVBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNsaWRlcklkOiBzZWxmLmdldFByb2plY3RvcklkKCksXG4gICAgICAgICAgICBkZWZpbmVkUHJldmlvdXNOZXh0OiBzZWxmLmdldERlZmluZWRQcmV2aW91c05leHQoKSxcbiAgICAgICAgICAgIGF1dG9TbGlkZTogc2VsZi5nZXRBdXRvU2xpZGUoKSxcbiAgICAgICAgICAgIHNsaWRlckludGVydmFsOiBzZWxmLmdldFNsaWRlckludGVydmFsKCksXG4gICAgICAgICAgICBuYXZpZ2F0aW9uQnV0dG9uczogc2VsZi5nZXROYXZpZ2F0aW9uQnV0dG9ucygpLFxuICAgICAgICAgICAgZG90czogc2VsZi5nZXREb3RzKCksXG4gICAgICAgICAgICBjYXB0aW9uczogc2VsZi5nZXRDYXB0aW9ucygpLFxuICAgICAgICAgICAgc2xpZGVRdWVyeTogc2VsZi5nZXRTbGlkZVF1ZXJ5KClcbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIC8vIE1hc3MgYXNzaWduIHNldHRpbmdzXG4gICAgdGhpcy5maWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBPYmplY3Qua2V5cyhzZXR0aW5nc09iamVjdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIC8vICAgICBzZWxmW2tleV0gPSBzZXR0aW5nc09iamVjdFtrZXldO1xuICAgICAgICAvLyB9KTtcblxuICAgICAgICBjb25zdCBzZXR0aW5nc09iamVjdEtleXMgPSBPYmplY3Qua2V5cyhzZXR0aW5nc09iamVjdCk7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzT2JqZWN0TGVuZ3RoID0gc2V0dGluZ3NPYmplY3RLZXlzLmxlbmd0aDtcblxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgc2V0dGluZ3NPYmplY3RMZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBzZXR0aW5nc09iamVjdEtleXNbaV07XG4gICAgICAgICAgICBzZWxmW2tleV0gPSBzZXR0aW5nc09iamVjdFtrZXldO1xuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgdGhpcy5maWxsKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzbGlkZXJJZDogc2VsZi5zZXRQcm9qZWN0b3JJZCxcbiAgICAgICAgZGVmaW5lZFByZXZpb3VzTmV4dDogc2VsZi5zZXREZWZpbmVkUHJldmlvdXNOZXh0LFxuICAgICAgICBhdXRvU2xpZGU6IHNlbGYuc2V0QXV0b1NsaWRlLFxuICAgICAgICBzbGlkZXJJbnRlcnZhbDogc2VsZi5zZXRTbGlkZXJJbnRlcnZhbCxcbiAgICAgICAgbmF2aWdhdGlvbkJ1dHRvbnM6IHNlbGYuc2V0TmF2aWdhdGlvbkJ1dHRvbnMsXG4gICAgICAgIGRvdHM6IHNlbGYuc2V0RG90cyxcbiAgICAgICAgY2FwdGlvbnM6IHNlbGYuc2V0Q2FwdGlvbnMsXG4gICAgICAgIHNsaWRlUXVlcnk6IHNlbGYuc2V0U2xpZGVRdWVyeSxcbiAgICAgICAgcHJlcGFyZVBhcmFtZXRlcnM6IHNlbGYucHJlcGFyZVBhcmFtZXRlcnNcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBQcm9qZWN0b3Ioc2V0dGluZ3MpIHtcblxuICAgIC8vRGVmaW5lIFByb2plY3RvciBvYmplY3RcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICB0aGlzLnNsaWRlck9iamVjdCA9ICcnO1xuXG4gICAgLy9TbGlkZVBhcmFtZXRlcnNcbiAgICB0aGlzLmFjdGl2ZVNsaWRlSWQgPSAwO1xuICAgIHRoaXMucHJldmlvdXNTbGlkZUlkID0gMDtcbiAgICB0aGlzLm5leHRTbGlkZUlkID0gMDtcbiAgICB0aGlzLmF2YWlsYWJsZVNsaWRlcyA9IDE7XG4gICAgdGhpcy5zbGlkZXMgPSBbXTtcbiAgICB0aGlzLmF1dG9TbGlkZUludGVydmFsID0gbnVsbDtcblxuICAgIHRoaXMuc2V0dGluZ3MgPSB7fTtcblxuICAgIHRoaXMuaW5pdCA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAvL0FwcGVuZCBzZXR0aW5ncyB0byBzZWxmXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcblxuICAgICAgICAvL0Fzc2lnbiBuZWVkZWQgZWxlbWVudHMgYW5kIGNhbGN1bGF0aW9uc1xuICAgICAgICB0aGlzLnNsaWRlck9iamVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2V0dGluZ3Muc2xpZGVySWQpO1xuICAgICAgICB0aGlzLnNsaWRlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5zZXR0aW5ncy5zbGlkZVF1ZXJ5KTtcbiAgICAgICAgdGhpcy5hdmFpbGFibGVTbGlkZXMgPSB0aGlzLnNsaWRlcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuYWN0aXZlU2xpZGVJZCA9IDA7XG5cbiAgICAgICAgLy9EZWZpbmUgcHJldmlvdXMgYW5kIG5leHQgaWYgd2Ugd2FudCB0byB1c2UgdGhvc2VcbiAgICAgICAgaWYgKHNlbGYuc2V0dGluZ3MuZGVmaW5lZFByZXZpb3VzTmV4dCkgdGhpcy5zZXRQcmV2aW91c0FuZE5leHRTbGlkZSgpO1xuXG4gICAgICAgIC8vIFNldCBhY3RpdmUgc2xpZGUgKGFuZCBwb3NzaWJsZSBwcmV2aW91cyBhbmQgbmV4dCBjbGFzc2VzKVxuICAgICAgICB0aGlzLnNldFNsaWRlKCk7XG5cbiAgICAgICAgLy8gU3dpcGUgaW50ZXJhY3Rpb25cbiAgICAgICAgY29uc3Qgc3dpcGVHZXN0dXJlcyA9IG5ldyBIYW1tZXIodGhpcy5zbGlkZXJPYmplY3QpO1xuICAgICAgICBzd2lwZUdlc3R1cmVzLm9uKCdzd2lwZWxlZnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnJlc2V0QXV0b1NsaWRlKCk7XG4gICAgICAgICAgICBzZWxmLm5leHRTbGlkZSgpO1xuICAgICAgICAgICAgc2VsZi5zZXRTbGlkZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgc3dpcGVHZXN0dXJlcy5vbignc3dpcGVyaWdodCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYucmVzZXRBdXRvU2xpZGUoKTtcbiAgICAgICAgICAgIHNlbGYucHJldmlvdXNTbGlkZSgpO1xuICAgICAgICAgICAgc2VsZi5zZXRTbGlkZSgpO1xuICAgICAgICB9KTtcblxuXG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MubmF2aWdhdGlvbkJ1dHRvbnMgIT09ICcnKSB7XG5cbiAgICAgICAgICAgIC8vIENsaWNrIGludGVyYWN0aW9uXG4gICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5zZXR0aW5ncy5uYXZpZ2F0aW9uQnV0dG9ucyk7XG4gICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQnV0dG9uc0xlbmd0aCA9IG5hdmlnYXRpb25CdXR0b25zLmxlbmd0aDtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uQnV0dG9uc0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQnV0dG9uID0gbmF2aWdhdGlvbkJ1dHRvbnNbaV07XG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGlja05hdmlnYXRpb25CdXR0b24odGhpcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmRvdHMgIT09ICcnKSB7XG4gICAgICAgICAgICAvLyBDbGljayBpbnRlcmFjdGlvblxuICAgICAgICAgICAgY29uc3QgZG90cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5zZXR0aW5ncy5kb3RzKTtcbiAgICAgICAgICAgIGNvbnN0IGRvdHNMZW5ndGggPSBkb3RzLmxlbmd0aDtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc2V0dGluZ3MuZG90cyk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhkb3RzKTtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBkb3RzTGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvdCA9IGRvdHNbaV07XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2hpZXInKTtcbiAgICAgICAgICAgICAgICBkb3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2xpY2tEb3QodGhpcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuYXV0b1NsaWRlKCk7XG4gICAgfTtcblxuXG4gICAgdGhpcy5hdXRvU2xpZGUgPSBmdW5jdGlvbiAoKXtcblxuICAgICAgICBpZih0aGlzLmF1dG9TbGlkZUludGVydmFsICE9PSBudWxsKSBjbGVhckludGVydmFsKHRoaXMuYXV0b1NsaWRlSW50ZXJ2YWwpO1xuXG4gICAgICAgIGlmKHRoaXMuc2V0dGluZ3MuYXV0b1NsaWRlICYmIE51bWJlci5pc0ludGVnZXIodGhpcy5zZXR0aW5ncy5zbGlkZXJJbnRlcnZhbCkgKXtcblxuICAgICAgICAgICAgdGhpcy5hdXRvU2xpZGVJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm5leHRTbGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFNsaWRlKCk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcy5zZXR0aW5ncy5zbGlkZXJJbnRlcnZhbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLnJlc2V0QXV0b1NsaWRlID0gc2VsZi5hdXRvU2xpZGU7XG5cblxuICAgIHRoaXMubmV4dFNsaWRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVNsaWRlSWQrKztcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlU2xpZGVJZCA+PSB0aGlzLmF2YWlsYWJsZVNsaWRlcykgdGhpcy5hY3RpdmVTbGlkZUlkID0gMDtcblxuICAgICAgICBpZiAoc2VsZi5zZXR0aW5ncy5kZWZpbmVkUHJldmlvdXNOZXh0KSB0aGlzLnNldFByZXZpb3VzQW5kTmV4dFNsaWRlKCk7XG4gICAgfTtcblxuICAgIHRoaXMucHJldmlvdXNTbGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVTbGlkZUlkLS07XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVNsaWRlSWQgPCAwKSB0aGlzLmFjdGl2ZVNsaWRlSWQgPSB0aGlzLmF2YWlsYWJsZVNsaWRlcyAtIDE7XG5cbiAgICAgICAgaWYgKHNlbGYuc2V0dGluZ3MuZGVmaW5lZFByZXZpb3VzTmV4dCkgdGhpcy5zZXRQcmV2aW91c0FuZE5leHRTbGlkZSgpO1xuICAgIH07XG5cbiAgICB0aGlzLnNldFByZXZpb3VzQW5kTmV4dFNsaWRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm5leHRTbGlkZUlkID0gdGhpcy5hY3RpdmVTbGlkZUlkICsgMTtcbiAgICAgICAgaWYgKHRoaXMubmV4dFNsaWRlSWQgPj0gdGhpcy5hdmFpbGFibGVTbGlkZXMpIHRoaXMubmV4dFNsaWRlSWQgPSAwO1xuXG4gICAgICAgIHRoaXMucHJldmlvdXNTbGlkZUlkID0gdGhpcy5hY3RpdmVTbGlkZUlkIC0gMTtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXNTbGlkZUlkIDwgMCkgdGhpcy5wcmV2aW91c1NsaWRlSWQgPSB0aGlzLmF2YWlsYWJsZVNsaWRlcyAtIDE7XG4gICAgfTtcblxuICAgIHRoaXMuc2V0U2xpZGUgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBmb3JtIGVsZW1lbnRzXG4gICAgICAgIGNvbnN0IHNsaWRlc0xlbmd0aCA9IHNlbGYuc2xpZGVzLmxlbmd0aDtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHNsaWRlc0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IHNsaWRlID0gc2VsZi5zbGlkZXNbaV07XG5cbiAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0YSBzZXQgYXR0cmlidXRlIHRvIGRlc2lyZWQgdHlwZVxuICAgICAgICAgICAgY29uc3Qgc2xpZGVPcmRlciA9IHBhcnNlSW50KHNsaWRlLmdldEF0dHJpYnV0ZSgnZGF0YS1vcmRlcicpKTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGFuZCBzZXQgYWN0aXZlIGZvciBhbGwgc2xpZGVzXG4gICAgICAgICAgICBpZiAoc2xpZGVPcmRlciAhPT0gc2VsZi5hY3RpdmVTbGlkZUlkKSBzbGlkZS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgIGVsc2Ugc2xpZGUuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIHVzZSB0aGUgcHJldmlvdXMgYW5kIG5leHQsIGFsc28gc2V0IHRob3NlIGNsYXNzZXNcbiAgICAgICAgICAgIGlmIChzZWxmLnNldHRpbmdzLmRlZmluZWRQcmV2aW91c05leHQpIHtcblxuICAgICAgICAgICAgICAgIGlmIChzbGlkZU9yZGVyICE9PSBzZWxmLnByZXZpb3VzU2xpZGVJZCkgc2xpZGUuY2xhc3NMaXN0LnJlbW92ZSgncHJldmlvdXMnKTtcbiAgICAgICAgICAgICAgICBlbHNlIHNsaWRlLmNsYXNzTGlzdC5hZGQoJ3ByZXZpb3VzJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2xpZGVPcmRlciAhPT0gc2VsZi5uZXh0U2xpZGVJZCkgc2xpZGUuY2xhc3NMaXN0LnJlbW92ZSgnbmV4dCcpO1xuICAgICAgICAgICAgICAgIGVsc2Ugc2xpZGUuY2xhc3NMaXN0LmFkZCgnbmV4dCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGYuc2V0dGluZ3MuZG90cyAhPT0gJycpIHsgc2VsZi5zZXRBY3RpdmVEb3QoKTsgfVxuICAgICAgICBpZiAoc2VsZi5zZXR0aW5ncy5jYXB0aW9ucyAhPT0gJycpIHsgc2VsZi5zZXRBY3RpdmVDYXB0aW9uKCk7IH1cbiAgICB9O1xuXG4gICAgdGhpcy5jbGlja05hdmlnYXRpb25CdXR0b24gPSBmdW5jdGlvbiAobmF2QnV0dG9uKSB7XG4gICAgICAgIHNlbGYuYWN0aXZlU2xpZGVJZCA9IHBhcnNlSW50KG5hdkJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JkZXInKSk7XG4gICAgICAgIGlmIChzZWxmLnNldHRpbmdzLmRlZmluZWRQcmV2aW91c05leHQpIHNlbGYuc2V0UHJldmlvdXNBbmROZXh0U2xpZGUoKTtcbiAgICAgICAgc2VsZi5zZXRTbGlkZSgpO1xuXG4gICAgICAgIGNvbnN0IG5leHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGYuc2V0dGluZ3MubmF2aWdhdGlvbkJ1dHRvbnMgKyAnLm5leHQnKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGYuc2V0dGluZ3MubmF2aWdhdGlvbkJ1dHRvbnMgKyAnLnByZXZpb3VzJyk7XG5cbiAgICAgICAgbmV4dC5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3JkZXInLCBzZWxmLm5leHRTbGlkZUlkKTtcbiAgICAgICAgcHJldmlvdXMuc2V0QXR0cmlidXRlKCdkYXRhLW9yZGVyJywgc2VsZi5wcmV2aW91c1NsaWRlSWQpO1xuXG4gICAgICAgIHNlbGYucmVzZXRBdXRvU2xpZGUoKTtcblxuICAgICAgICAvLyBuZXh0LnF1ZXJ5U2VsZWN0b3IoJ3AnKS5pbm5lckhUTUwgPSBzZWxmLnNsaWRlc1tzZWxmLm5leHRTbGlkZUlkXS5kYXRhc2V0Lm5hbWU7XG4gICAgICAgIC8vIHByZXZpb3VzLnF1ZXJ5U2VsZWN0b3IoJ3AnKS5pbm5lckhUTUwgPSBzZWxmLnNsaWRlc1tzZWxmLnByZXZpb3VzU2xpZGVJZF0uZGF0YXNldC5uYW1lO1xuICAgIH07XG5cbiAgICB0aGlzLmNsaWNrRG90ID0gZnVuY3Rpb24gKGNsaWNrZWREb3QpIHtcbiAgICAgICAgc2VsZi5hY3RpdmVTbGlkZUlkID0gcGFyc2VJbnQoY2xpY2tlZERvdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JkZXInKSk7XG4gICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcbiAgICAgICAgc2VsZi5yZXNldEF1dG9TbGlkZSgpO1xuICAgIH07XG5cbiAgICB0aGlzLnNldEFjdGl2ZURvdCA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBjb25zdCBkb3RzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLmRvdHMpO1xuICAgICAgICBjb25zdCBkb3RzTGVuZ3RoID0gZG90cy5sZW5ndGg7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBkb3RzTGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgY29uc3QgZG90ID0gZG90c1tpXTtcbiAgICAgICAgICAgIGRvdE9yZGVyID0gcGFyc2VJbnQoZG90LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmRlcicpKTtcblxuICAgICAgICAgICAgaWYoZG90T3JkZXIgIT09IHNlbGYuYWN0aXZlU2xpZGVJZCkgZG90LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgZWxzZSBkb3QuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5zZXRBY3RpdmVDYXB0aW9uID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGNvbnN0IGNhcHRpb25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLmNhcHRpb25zKTtcbiAgICAgICAgY29uc3QgY2FwdGlvbnNMZW5ndGggPSBjYXB0aW9ucy5sZW5ndGg7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBjYXB0aW9uc0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IGNhcHRpb24gPSBjYXB0aW9uc1tpXTtcbiAgICAgICAgICAgIGNhcHRpb25PcmRlciA9IHBhcnNlSW50KGNhcHRpb24uZ2V0QXR0cmlidXRlKCdkYXRhLW9yZGVyJykpO1xuXG4gICAgICAgICAgICBpZihjYXB0aW9uT3JkZXIgIT09IHNlbGYuYWN0aXZlU2xpZGVJZCkgY2FwdGlvbi5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgIGVsc2UgY2FwdGlvbi5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgfVxuICAgIH07XG59IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBTY3JvbGwgVG8gQ2xpY2sgaGFuZGxlclxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IFNjcm9sbFRvSGFuZGxlciA9IHtcblxuICAgIC8vIEFuaW1hdGlvbiBzZXR0aW5nc1xuICAgIG9mZnNldCA6IDYwLCAvL3BpeGVsXG4gICAgZHVyYXRpb24gOiAxNDAwLCAvL21zXG5cbiAgICAvLyBBbmltYXRpb24gdmFyaWFibGVzXG4gICAgYm9keSA6IG51bGwsXG4gICAgc3RhcnQgOiAwLFxuICAgIGNoYW5nZSA6IDAsXG4gICAgY3VycmVudFRpbWUgOiAwLFxuICAgIGFsbG93QW5pbWF0aW9uIDogZmFsc2UsXG4gICAgc2Nyb2xsVG9BbmltYXRpb24gOiBudWxsLFxuXG4gICAgLy8gV2F0Y2ggdGhlIEVhc2luZ0Z1bmN0aW9uIGhlbHBlciBmb3IgdGhlIGF2YWlsYWJsZSBtZXRob2RzXG4gICAgZWFzaW5nOiAnZWFzZUluT3V0UXVhZCcsXG5cbiAgICBpbml0IDogZnVuY3Rpb24oKXtcblxuICAgICAgICBjb25zdCBhbmNob3JMaW5rcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1zY3JvbGwtdG8tdGFyZ2V0Jyk7XG4gICAgICAgIGNvbnN0IGFuY2hvckxpbmtzQW1vdW50ID0gYW5jaG9yTGlua3MubGVuZ3RoO1xuXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBhbmNob3JMaW5rc0Ftb3VudDsgaSsrKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGFuY2hvckxpbmsgPSBhbmNob3JMaW5rc1tpXTtcblxuICAgICAgICAgICAgYW5jaG9yTGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIFNjcm9sbFRvSGFuZGxlci5wcmVwYXJlU2Nyb2xsVG8odGhpcy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmUgdGhlIEhhbmRsZXIgZm9yIHRoZSBhbmltYXRpb25cbiAgICAgKi9cbiAgICBwcmVwYXJlU2Nyb2xsVG8gOiBmdW5jdGlvbihlbGVtZW50SWQpe1xuXG4gICAgICAgIC8vIEdldCB0aGUgc2Nyb2xsIHRvIGVsZW1lbnRcbiAgICAgICAgZWxlbWVudElkID0gZWxlbWVudElkLnN1YnN0cihlbGVtZW50SWQuaW5kZXhPZignIycpKzEpO1xuICAgICAgICBjb25zdCBzY3JvbGxUb0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICAgICAgICBjb25zdCBzY3JvbGxUb0VsZW1lbnRQb3NpdGlvbiA9IHNjcm9sbFRvRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAvLyBSZXNldCBvciBkZWZpbmUgdGhlIEhhbmRsZXIgdmFyaWFibGVzXG4gICAgICAgIFNjcm9sbFRvSGFuZGxlci5ib2R5ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuc3RhcnQgPSBNYXRoLm1heChTY3JvbGxUb0hhbmRsZXIuYm9keS5zY3JvbGxUb3AsIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wLCB3aW5kb3cucGFnZVlPZmZzZXQpOyAvL1VzZSBNYXRoLm1heCBiZWNhdXNlIHNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcFxuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuY2hhbmdlID0gKChzY3JvbGxUb0VsZW1lbnRQb3NpdGlvbi50b3AgKyBTY3JvbGxUb0hhbmRsZXIuc3RhcnQpIC0gU2Nyb2xsVG9IYW5kbGVyLnN0YXJ0KSAtIFNjcm9sbFRvSGFuZGxlci5vZmZzZXQ7XG4gICAgICAgIFNjcm9sbFRvSGFuZGxlci5zdGFydFRpbWUgPSAnbm93JyBpbiB3aW5kb3cucGVyZm9ybWFuY2UgPyBwZXJmb3JtYW5jZS5ub3coKSA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuYWxsb3dBbmltYXRpb24gPSB0cnVlO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgYW5pbWF0aW9uXG4gICAgICAgIHNjcm9sbFRvQW5pbWF0aW9uID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKFNjcm9sbFRvSGFuZGxlci5hbmltYXRlU2Nyb2xsKTtcblxuICAgICAgICAvLyBTdG9wIG9uIHNjcm9sbFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU1vdXNlU2Nyb2xsJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLCBTY3JvbGxUb0hhbmRsZXIuYWJvcnRTY3JvbGxBbmltYXRpb24pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBTY3JvbGxUb0hhbmRsZXIuYWJvcnRTY3JvbGxBbmltYXRpb24pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcblxuICAgIH0sXG5cbiAgICAvKlxuICAgICAqIEFuaW1hdGUgdGhlIHNjcm9sbCBwb3NpdGlvblxuICAgICAqL1xuICAgIGFuaW1hdGVTY3JvbGwgOiBmdW5jdGlvbiAodGltZXN0YW1wKSB7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHByb2dyZXNzIGZyb20gMCAtIDFcbiAgICAgICAgbGV0IHByb2dyZXNzID0gTWF0aC5taW4oMSwgKHRpbWVzdGFtcCAtICBTY3JvbGxUb0hhbmRsZXIuc3RhcnRUaW1lKSAvIFNjcm9sbFRvSGFuZGxlci5kdXJhdGlvbik7XG4gICAgICAgIGlmKHByb2dyZXNzIDwgMCkgcHJvZ3Jlc3MgPSAwO1xuXG4gICAgICAgIC8vIENvbnZlcnQgcHJvZ3Jlc3Mgd2l0aCBlYXNpbmcgZnVuY3Rpb25cbiAgICAgICAgcHJvZ3Jlc3MgPSBFYXNpbmdGdW5jdGlvbnNbU2Nyb2xsVG9IYW5kbGVyLmVhc2luZ10ocHJvZ3Jlc3MpO1xuXG4gICAgICAgIGNvbnN0IG5ld1Njcm9sbFRvcCA9IFNjcm9sbFRvSGFuZGxlci5zdGFydCArICggU2Nyb2xsVG9IYW5kbGVyLmNoYW5nZSAqIHByb2dyZXNzICk7XG5cbiAgICAgICAgU2Nyb2xsVG9IYW5kbGVyLmJvZHkuc2Nyb2xsVG9wID0gbmV3U2Nyb2xsVG9wO1xuICAgICAgICBpZiggU2Nyb2xsVG9IYW5kbGVyLmJvZHkuc2Nyb2xsVG9wID09PSAwICkgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSBuZXdTY3JvbGxUb3A7IC8vIFNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgc28gaWYgU2Nyb2xsVG9IYW5kbGVyLmJvZHkuc2Nyb2xsVG9wIGlzIDAgZm9yY2UgdGhlIHNjcm9sbCBwb3NpdGlvbiB0aHJvdWdoIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wXG5cbiAgICAgICAgaWYocHJvZ3Jlc3MgPCAxICYmIFNjcm9sbFRvSGFuZGxlci5hbGxvd0FuaW1hdGlvbil7XG4gICAgICAgICAgICBzY3JvbGxUb0FuaW1hdGlvbiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShTY3JvbGxUb0hhbmRsZXIuYW5pbWF0ZVNjcm9sbCk7XG4gICAgICAgIH1cblxuICAgIH0sXG5cbiAgICAvKlxuICAgICAqIEFib3J0IHRoZSBzY3JvbGwgYW5pbWF0aW9uXG4gICAgICovXG4gICAgYWJvcnRTY3JvbGxBbmltYXRpb24gOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgU2Nyb2xsVG9IYW5kbGVyLmFsbG93QW5pbWF0aW9uID0gZmFsc2U7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKFNjcm9sbFRvSGFuZGxlci5zY3JvbGxUb0FuaW1hdGlvbik7XG4gICAgfVxuXG59O1xuXG5TY3JvbGxUb0hhbmRsZXIuaW5pdCgpOyIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgWW91dHViZSBoYW5kbGVyXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuY29uc3QgWW91dHViZUhhbmRsZXIgPSB7XG5cbiAgICB5b3V0dWJlQ2xhc3MgOiAnLmpzLXlvdXR1YmUtcGxheWVyJyxcbiAgICBwbGF5ZXJzOiBbXSxcblxuICAgIGluaXQgOiBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICAvLyBHZXQgdGhlIHlvdXR1YmUgcGxheWVycyBjb250YWluZXJzXG4gICAgICAgIGNvbnN0IHlvdXR1YmVQbGF5ZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChZb3V0dWJlSGFuZGxlci55b3V0dWJlQ2xhc3MpO1xuICAgICAgICBjb25zdCB5b3V0dWJlUGxheWVyc0Ftb3VudCA9IHlvdXR1YmVQbGF5ZXJzLmxlbmd0aDtcblxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgeW91dHViZVBsYXllcnNBbW91bnQ7IGkrKyl7XG5cbiAgICAgICAgICAgIGNvbnN0IHlvdXR1YmVQbGF5ZXIgPSB5b3V0dWJlUGxheWVyc1tpXTtcblxuXG4gICAgICAgICAgICBjb25zdCB5b3V0dWJlUGxheWVySWQgPSB5b3V0dWJlUGxheWVyLmdldEF0dHJpYnV0ZSgnaWQnKTtcbiAgICAgICAgICAgIGlmKHlvdXR1YmVQbGF5ZXJJZCAhPT0gbnVsbCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gU3RyaXAgdGhlIG5lY2Vzc2FyeSBkYXRhIGZyb20gdGhlIGh0bWwgYW5kIGNyZWF0ZSBvYmplY3RzIGZyb20gaXRcbiAgICAgICAgICAgICAgICBjb25zdCB5b3V0dWJlRWxlbWVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHlvdXR1YmVQbGF5ZXIuZ2V0QXR0cmlidXRlKCdpZCcpLFxuICAgICAgICAgICAgICAgICAgICBsaW5rOiB5b3V0dWJlUGxheWVyLmdldEF0dHJpYnV0ZSgnZGF0YS15b3V0dWJlLWxpbmsnKSxcbiAgICAgICAgICAgICAgICAgICAgYXV0b1BsYXk6IHBhcnNlSW50KHlvdXR1YmVQbGF5ZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWF1dG8tcGxheScpKSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgWW91dHViZUhhbmRsZXIucGxheWVycy5wdXNoKHlvdXR1YmVFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFbGVtZW50IG5vdCBpbmNsdWRlIGJlY2F1c2UgdGhlcmUgaXNuJ3QgYSBpZCBvbiB0aGUgcGxheWVyXCIpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHlvdXR1YmVQbGF5ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoeW91dHViZVBsYXllcnNBbW91bnQgPj0gMSkgWW91dHViZUhhbmRsZXIuaW5pdFlvdXR1YmUoKTtcblxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBleHRlcm5hbCBzY3JpcHQgaXMgbG9hZGVkXG4gICAgICpcbiAgICAgKi9cbiAgICBpbml0WW91dHViZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFNlZSBpZiBZVCB2YXJpYWJsZSBleGlzdHNcbiAgICAgICAgaWYgKHR5cGVvZihZVCkgPT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mKFlULlBsYXllcikgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIFNldHVwIEFQSSByZWFkeSBmdW5jdGlvblxuICAgICAgICAgICAgd2luZG93Lm9uWW91VHViZVBsYXllckFQSVJlYWR5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgWW91dHViZUhhbmRsZXIubG9hZFBsYXllcnMoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBMb2FkIGV4dGVybmFsIHNjcmlwdFxuICAgICAgICAgICAgZ2V0U2NyaXB0KCdodHRwczovL3d3dy55b3V0dWJlLmNvbS9pZnJhbWVfYXBpJyk7XG4gICAgICAgICAgICAvLyBJZiBZVCBhbHJlYWR5IGV4aXN0cyBsb2FkIHBsYXllclxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgWW91dHViZUhhbmRsZXIubG9hZFBsYXllcnMoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgdGhlIFlvdXR1YmUgcGxheWVyKHMpIHdpdGggcGFyYW1ldGVyc1xuICAgICAqIEFuZCByZXdyaXRlIHRoZSBwbGF5ZXJzIHRvIGtleSB0aGVtIGJ5IHRoZSBlbGVtZW50IGlkXG4gICAgICpcbiAgICAgKi9cbiAgICBsb2FkUGxheWVyczogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgbGV0IHBsYXllcnMgPSBbXTtcblxuICAgICAgICBjb25zdCB5b3V0dWJlUGxheWVyc0Ftb3VudCA9IFlvdXR1YmVIYW5kbGVyLnBsYXllcnMubGVuZ3RoO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgeW91dHViZVBsYXllcnNBbW91bnQ7IGkrKyl7XG5cbiAgICAgICAgICAgIGxldCB5b3V0dWJlUGxheWVyID0gWW91dHViZUhhbmRsZXIucGxheWVyc1tpXTtcblxuICAgICAgICAgICAgLy8gTG9hZCBwbGF5ZXJcbiAgICAgICAgICAgIHlvdXR1YmVQbGF5ZXIucGxheWVyID0gbmV3IFlULlBsYXllcih5b3V0dWJlUGxheWVyLmlkLHtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDIwMCxcbiAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgICAgIHZpZGVvSWQ6IHlvdXR1YmVQbGF5ZXIubGluayxcbiAgICAgICAgICAgICAgICBob3N0OiAnaHR0cHM6Ly93d3cueW91dHViZS1ub2Nvb2tpZS5jb20nLFxuICAgICAgICAgICAgICAgIHBsYXllclZhcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZXN0YnJhbmRpbmc6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJlbDogMCxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWtiOiAxLFxuICAgICAgICAgICAgICAgICAgICBhdXRvcGxheTogeW91dHViZVBsYXllci5hdXRvUGxheVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICdvblJlYWR5JzogWW91dHViZUhhbmRsZXIub25SZWFkeSxcbiAgICAgICAgICAgICAgICAgICAgJ29uU3RhdGVDaGFuZ2UnOiBZb3V0dWJlSGFuZGxlci5vblN0YXRlQ2hhbmdlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHBsYXllcnNbeW91dHViZVBsYXllci5pZF0gPSB5b3V0dWJlUGxheWVyO1xuXG4gICAgICAgIH1cblxuICAgICAgICBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzID0gcGxheWVycztcblxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBXaGVuIHBsYXllciBpcyByZWFkeSB0byBwbGF5XG4gICAgICovXG4gICAgb25SZWFkeSA6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cbiAgICAgICAgY29uc3QgcGxheWVyQ29udGFpbmVySWQgPSBldmVudC50YXJnZXQuZ2V0SWZyYW1lKCkuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzW3BsYXllckNvbnRhaW5lcklkXS5wbGF5ZXI7XG5cbiAgICAgICAgLy8gU2hvdyB2aWRlb1xuICAgICAgICAvLyBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ICQoJyMnICsgcGxheWVyQ29udGFpbmVySWQpLnN0b3AoKS5hbmltYXRlKHsgb3BhY2l0eTogMSB9LDEwMDApIH0sODAwKTtcblxuICAgICAgICAvLyBJZiBub3Qgb24gdGFibGV0IG9yIG1vYmlsZSwgcGxheSBvbiBoaWdoIHF1YWxpdHlcbiAgICAgICAgLy8gcGxheWVyLm11dGUoKTtcbiAgICAgICAgLy8gcGxheWVyLnBsYXlWaWRlbygpO1xuICAgICAgICAvLyBwbGF5ZXIuc2V0UGxheWJhY2tRdWFsaXR5KCdoZDEwODAnKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuZXIgZm9yIFlvdXR1YmUgc3RhdGUgY2hhbmdlXG4gICAgICovXG4gICAgb25TdGF0ZUNoYW5nZSA6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cbiAgICAgICAgY29uc3QgcGxheWVyQ29udGFpbmVySWQgPSBldmVudC50YXJnZXQuZ2V0SWZyYW1lKCkuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzW3BsYXllckNvbnRhaW5lcklkXS5wbGF5ZXI7XG5cbiAgICAgICAgY29uc3QgdmlkZW9TdGF0ZSA9IGV2ZW50LmRhdGE7XG5cbiAgICAgICAgLy8gTG9vcCB2aWRlb1xuICAgICAgICBpZiAoZXZlbnQuZGF0YSA9PT0gWVQuUGxheWVyU3RhdGUuRU5ERUQgKSB7XG4gICAgICAgICAgICBwbGF5ZXIucGxheVZpZGVvKCk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5Zb3V0dWJlSGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIEJyb3dzZXIgSGFuZGxlclxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IEJyb3dzZXJIYW5kbGVyID0ge1xuXG4gICAgdXNlckFnZW50OiAnJyxcbiAgICBicm93c2VySW5mbzogJycsXG5cblxuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQnJvd3NlckhhbmRsZXIudXNlckFnZW50ID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgICAgIEJyb3dzZXJIYW5kbGVyLmJyb3dzZXJJbmZvID0gQnJvd3NlckhhbmRsZXIuZ2V0QnJvd3NlckluZm8oKTtcbiAgICAgICAgQnJvd3NlckhhbmRsZXIuaGFuZGxlSUUoKTtcbiAgICAgICAgQnJvd3NlckhhbmRsZXIuaGFuZGxlU2FmYXJpKCk7XG4gICAgfSxcblxuICAgIGhhbmRsZUlFOiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy8gRGV0ZWN0IHZlcnNpb25zIGJlbG93IGllMTFcbiAgICAgICAgbGV0IG1zaWUgPSBCcm93c2VySGFuZGxlci51c2VyQWdlbnQuaW5kZXhPZignTVNJRSAnKTtcbiAgICAgICAgY29uc3QgaWVsdDExID0gbXNpZSA+IDA7XG5cbiAgICAgICAgLy8gRGV0ZWN0IGllMTFcbiAgICAgICAgY29uc3QgaWUxMSA9ICEhbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvVHJpZGVudC4qcnZcXDoxMVxcLi8pO1xuXG4gICAgICAgIC8vIElmIEludGVybmV0IEV4cGxvcmVyXG4gICAgICAgIGlmIChpZWx0MTEgfHwgaWUxMSkge1xuICAgICAgICAgICAgLy8gRGVmYXVsdCB2ZXJzaW9uXG4gICAgICAgICAgICBsZXQgdmVyc2lvbiA9ICcxMSc7XG5cbiAgICAgICAgICAgIC8vIFdheSB0byBkZXRlY3QgdmVyc2lvbiA8IDExXG4gICAgICAgICAgICBpZiAoaWVsdDExKSB2ZXJzaW9uID0gcGFyc2VJbnQoQnJvd3NlckhhbmRsZXIudXNlckFnZW50LnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICBtc2llICsgNSxcbiAgICAgICAgICAgICAgICBCcm93c2VySGFuZGxlci51c2VyQWdlbnQuaW5kZXhPZihcIi5cIiwgbXNpZSlcbiAgICAgICAgICAgICkpO1xuXG4gICAgICAgICAgICAvLyBBcHBlbmQgY2xhc3NlcyB0byBIVE1MICh3ZSBoYXZlIHRvIGRvIHRoaXMgc2VwYXJhdGVseSBiZWNhdXNlIGVsc2UgaWUgd2lsbCBmYWlsKVxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdpZScpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCd2Jyt2ZXJzaW9uKTtcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8vIEZhbGxiYWNrIGZvciBvbGRlciBzYWZhcmkgdmVyc2lvblxuICAgIGhhbmRsZVNhZmFyaTogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGlmKEJyb3dzZXJIYW5kbGVyLmJyb3dzZXJJbmZvLm5hbWUgPT09ICdTYWZhcmknICYmIEJyb3dzZXJIYW5kbGVyLmJyb3dzZXJJbmZvLnZlcnNpb24gPD0gMTApe1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXS5jbGFzc0xpc3QuYWRkKCdpZScpO1xuICAgICAgICB9XG5cbiAgICB9LFxuXG4gICAgZ2V0QnJvd3NlckluZm86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHVhPW5hdmlnYXRvci51c2VyQWdlbnQsdGVtLE09dWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XFwvKSlcXC8/XFxzKihcXGQrKS9pKSB8fCBbXTtcbiAgICAgICAgaWYoL3RyaWRlbnQvaS50ZXN0KE1bMV0pKXtcbiAgICAgICAgICAgIHRlbT0vXFxicnZbIDpdKyhcXGQrKS9nLmV4ZWModWEpIHx8IFtdO1xuICAgICAgICAgICAgcmV0dXJuIHtuYW1lOidJRSAnLHZlcnNpb246KHRlbVsxXXx8JycpfTtcbiAgICAgICAgfVxuICAgICAgICBpZihNWzFdPT09J0Nocm9tZScpe1xuICAgICAgICAgICAgdGVtPXVhLm1hdGNoKC9cXGJPUFJcXC8oXFxkKykvKVxuICAgICAgICAgICAgaWYodGVtIT1udWxsKSAgIHtyZXR1cm4ge25hbWU6J09wZXJhJywgdmVyc2lvbjp0ZW1bMV19O31cbiAgICAgICAgfVxuICAgICAgICBNPU1bMl0/IFtNWzFdLCBNWzJdXTogW25hdmlnYXRvci5hcHBOYW1lLCBuYXZpZ2F0b3IuYXBwVmVyc2lvbiwgJy0/J107XG4gICAgICAgIGlmKCh0ZW09dWEubWF0Y2goL3ZlcnNpb25cXC8oXFxkKykvaSkpIT1udWxsKSB7TS5zcGxpY2UoMSwxLHRlbVsxXSk7fVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogTVswXSxcbiAgICAgICAgICAgIHZlcnNpb246IE1bMV1cbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5Ccm93c2VySGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBIZWxwZXIgZnVuY3Rpb25zXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLypcbiAqIFNpbXBsZSBpc3NldCBtZXRob2QgZm9yIHRoaXMgZG9lcyBub3QgZXhpc3QgaW4gamF2YXNjcmlwdFxuICovXG53aW5kb3cuaXNzZXQgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogIT09ICd1bmRlZmluZWQnICYmIG9iaiAhPT0gbnVsbDtcbn07XG5cbi8qXG4gKiBFYXNpbmcgRnVuY3Rpb25zIC0gaW5zcGlyZWQgZnJvbSBodHRwOi8vZ2l6bWEuY29tL2Vhc2luZy9cbiAqIG9ubHkgY29uc2lkZXJpbmcgdGhlIHQgdmFsdWUgZm9yIHRoZSByYW5nZSBbMCwgMV0gPT4gWzAsIDFdXG4gKi9cbndpbmRvdy5FYXNpbmdGdW5jdGlvbnMgPSB7XG4gICAgLy8gbm8gZWFzaW5nLCBubyBhY2NlbGVyYXRpb25cbiAgICBsaW5lYXI6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0XG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpbmcgZnJvbSB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZUluUXVhZDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgKiB0XG4gICAgfSxcbiAgICAvLyBkZWNlbGVyYXRpbmcgdG8gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VPdXRRdWFkOiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCAqICgyIC0gdClcbiAgICB9LFxuICAgIC8vIGFjY2VsZXJhdGlvbiB1bnRpbCBoYWxmd2F5LCB0aGVuIGRlY2VsZXJhdGlvblxuICAgIGVhc2VJbk91dFF1YWQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0IDwgLjUgPyAyICogdCAqIHQgOiAtMSArICg0IC0gMiAqIHQpICogdFxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW5nIGZyb20gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VJbkN1YmljOiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCAqIHQgKiB0XG4gICAgfSxcbiAgICAvLyBkZWNlbGVyYXRpbmcgdG8gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VPdXRDdWJpYzogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuICgtLXQpICogdCAqIHQgKyAxXG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpb24gdW50aWwgaGFsZndheSwgdGhlbiBkZWNlbGVyYXRpb25cbiAgICBlYXNlSW5PdXRDdWJpYzogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPCAuNSA/IDQgKiB0ICogdCAqIHQgOiAodCAtIDEpICogKDIgKiB0IC0gMikgKiAoMiAqIHQgLSAyKSArIDFcbiAgICB9LFxuICAgIC8vIGFjY2VsZXJhdGluZyBmcm9tIHplcm8gdmVsb2NpdHlcbiAgICBlYXNlSW5RdWFydDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgKiB0ICogdCAqIHRcbiAgICB9LFxuICAgIC8vIGRlY2VsZXJhdGluZyB0byB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZU91dFF1YXJ0OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gMSAtICgtLXQpICogdCAqIHQgKiB0XG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpb24gdW50aWwgaGFsZndheSwgdGhlbiBkZWNlbGVyYXRpb25cbiAgICBlYXNlSW5PdXRRdWFydDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPCAuNSA/IDggKiB0ICogdCAqIHQgKiB0IDogMSAtIDggKiAoLS10KSAqIHQgKiB0ICogdFxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW5nIGZyb20gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VJblF1aW50OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCAqIHQgKiB0ICogdCAqIHRcbiAgICB9LFxuICAgIC8vIGRlY2VsZXJhdGluZyB0byB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZU91dFF1aW50OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gMSArICgtLXQpICogdCAqIHQgKiB0ICogdFxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW9uIHVudGlsIGhhbGZ3YXksIHRoZW4gZGVjZWxlcmF0aW9uXG4gICAgZWFzZUluT3V0UXVpbnQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0IDwgLjUgPyAxNiAqIHQgKiB0ICogdCAqIHQgKiB0IDogMSArIDE2ICogKC0tdCkgKiB0ICogdCAqIHQgKiB0XG4gICAgfVxufTtcblxuLypcbiAqIFZhbmlsbGEgdmVyc2lvbiBvZiB0aGUgJC5nZXRTY3JpcHRcbiAqL1xud2luZG93LmdldFNjcmlwdCA9IGZ1bmN0aW9uIChzb3VyY2UsIGNhbGxiYWNrKSB7XG4gICAgbGV0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHNjcmlwdC5hc3luYyA9IDE7XG5cbiAgICBjb25zdCBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpO1xuICAgIGxldCBwcmlvciA9IHNjcmlwdHNbc2NyaXB0cy5sZW5ndGggLSAxXTtcblxuICAgIHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKF8sIGlzQWJvcnQpIHtcbiAgICAgICAgaWYgKGlzQWJvcnQgfHwgIXNjcmlwdC5yZWFkeVN0YXRlIHx8IC9sb2FkZWR8Y29tcGxldGUvLnRlc3Qoc2NyaXB0LnJlYWR5U3RhdGUpKSB7XG4gICAgICAgICAgICBzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICBzY3JpcHQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGlmICghaXNBYm9ydCkge1xuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBzY3JpcHQuc3JjID0gc291cmNlO1xuICAgIHByaW9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNjcmlwdCwgcHJpb3IpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIGFzIGxvbmcgYXMgaXQgY29udGludWVzIHRvIGJlIGludm9rZWQsIHdpbGwgbm90XG4gKiBiZSB0cmlnZ2VyZWQuIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZnRlciBpdCBzdG9wcyBiZWluZyBjYWxsZWQgZm9yXG4gKiBOIG1pbGxpc2Vjb25kcy4gSWYgYGltbWVkaWF0ZWAgaXMgcGFzc2VkLCB0cmlnZ2VyIHRoZSBmdW5jdGlvbiBvbiB0aGVcbiAqIGxlYWRpbmcgZWRnZSwgaW5zdGVhZCBvZiB0aGUgdHJhaWxpbmcuXG4gKiBAcGFyYW0gZnVuY1xuICogQHBhcmFtIHdhaXRcbiAqIEBwYXJhbSBpbW1lZGlhdGVcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xud2luZG93LmRlYm91bmNlID0gZnVuY3Rpb24oZnVuYywgd2FpdCwgaW1tZWRpYXRlKSB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBsZXQgbGF0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmICghaW1tZWRpYXRlKSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG4gICAgICAgIGlmIChjYWxsTm93KSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIH07XG59O1xuXG4vKlxuICogQ29va2llIGhlbHBlciBjbGFzc1xuICovXG53aW5kb3cuQ29va2llID0ge1xuICAgIHNldDogZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBkYXlzKSB7XG4gICAgICAgIGxldCBkb21haW4sIGRvbWFpblBhcnRzLCBkYXRlLCBleHBpcmVzLCBob3N0O1xuXG4gICAgICAgIGlmIChkYXlzKSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIChkYXlzICogMjQgKiA2MCAqIDYwICogMTAwMCkpO1xuICAgICAgICAgICAgZXhwaXJlcyA9IFwiOyBleHBpcmVzPVwiICsgZGF0ZS50b0dNVFN0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXhwaXJlcyA9IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBob3N0ID0gbG9jYXRpb24uaG9zdDtcbiAgICAgICAgaWYgKGhvc3Quc3BsaXQoJy4nKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIC8vIG5vIFwiLlwiIGluIGEgZG9tYWluIC0gaXQncyBsb2NhbGhvc3Qgb3Igc29tZXRoaW5nIHNpbWlsYXJcbiAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyBcIj1cIiArIHZhbHVlICsgZXhwaXJlcyArIFwiOyBwYXRoPS9cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSBjb29raWUgb24gYWxsIHN1YiBkb21haW5zLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFN0YXJ0IHdpdGggdHJ5aW5nIHRvIHNldCBjb29raWUgdG8gdGhlIHRvcCBkb21haW4uXG4gICAgICAgICAgICAvLyAoZXhhbXBsZTogaWYgdXNlciBpcyBvbiBmb28uY29tLCB0cnkgdG8gc2V0XG4gICAgICAgICAgICAvLyAgY29va2llIHRvIGRvbWFpbiBcIi5jb21cIilcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBJZiB0aGUgY29va2llIHdpbGwgbm90IGJlIHNldCwgaXQgbWVhbnMgXCIuY29tXCJcbiAgICAgICAgICAgIC8vIGlzIGEgdG9wIGxldmVsIGRvbWFpbiBhbmQgd2UgbmVlZCB0b1xuICAgICAgICAgICAgLy8gc2V0IHRoZSBjb29raWUgdG8gXCIuZm9vLmNvbVwiXG4gICAgICAgICAgICBkb21haW5QYXJ0cyA9IGhvc3Quc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIGRvbWFpblBhcnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICBkb21haW4gPSAnLicgKyBkb21haW5QYXJ0cy5qb2luKCcuJyk7XG5cbiAgICAgICAgICAgIC8vIEZvciBkZXZlbG9wbWVudCBwdXJwb3NlLCByZW1vdmUgdGhpcyB3aGVuIG1vdmluZyB0byBwcm9kdWN0aW9uXG4gICAgICAgICAgICAvLyBkb21haW4gPSAnLmtvbW1hLnBybyc7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyBcIj1cIiArIHZhbHVlICsgZXhwaXJlcyArIFwiOyBwYXRoPS87IGRvbWFpbj1cIiArIGRvbWFpbjtcblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgY29va2llIHdhcyBzdWNjZXNzZnVseSBzZXQgdG8gdGhlIGdpdmVuIGRvbWFpblxuICAgICAgICAgICAgLy8gKG90aGVyd2lzZSBpdCB3YXMgYSBUb3AtTGV2ZWwgRG9tYWluKVxuICAgICAgICAgICAgaWYgKENvb2tpZS5nZXQobmFtZSkgPT0gbnVsbCB8fCBDb29raWUuZ2V0KG5hbWUpICE9IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gYXBwZW5kIFwiLlwiIHRvIGN1cnJlbnQgZG9tYWluXG4gICAgICAgICAgICAgICAgZG9tYWluID0gJy4nICsgaG9zdDtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBuYW1lICsgXCI9XCIgKyB2YWx1ZSArIGV4cGlyZXMgKyBcIjsgcGF0aD0vOyBkb21haW49XCIgKyBkb21haW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBjb25zdCBuYW1lRVEgPSBuYW1lICsgXCI9XCI7XG4gICAgICAgIGNvbnN0IGNhID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2EubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjID0gY2FbaV07XG4gICAgICAgICAgICB3aGlsZSAoYy5jaGFyQXQoMCkgPT09ICcgJykge1xuICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxLCBjLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjLmluZGV4T2YobmFtZUVRKSA9PT0gMCkgcmV0dXJuIGMuc3Vic3RyaW5nKG5hbWVFUS5sZW5ndGgsIGMubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgZXJhc2U6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIENvb2tpZS5zZXQobmFtZSwgJycsIC0xKTtcbiAgICB9XG59O1xuXG4vKlxuICogSmF2YXNjcmlwdCB2ZXJzaW9uIG9mIHRoZSBudW1iZXJfZm9ybWF0IG1ldGhvZCBvZiBQSFBcbiAqL1xud2luZG93Lm51bWJlcl9mb3JtYXQgPSBmdW5jdGlvbiAobnVtYmVyLCBkZWNpbWFscywgZGVjX3BvaW50LCB0aG91c2FuZHNfc2VwKSB7XG4gICAgLy8gU3RyaXAgYWxsIGNoYXJhY3RlcnMgYnV0IG51bWVyaWNhbCBvbmVzLlxuICAgIG51bWJlciA9IChudW1iZXIgKyAnJykucmVwbGFjZSgvW14wLTkrXFwtRWUuXS9nLCAnJyk7XG4gICAgbGV0IG4gPSAhaXNGaW5pdGUoK251bWJlcikgPyAwIDogK251bWJlcixcbiAgICAgICAgcHJlYyA9ICFpc0Zpbml0ZSgrZGVjaW1hbHMpID8gMCA6IE1hdGguYWJzKGRlY2ltYWxzKSxcbiAgICAgICAgc2VwID0gKHR5cGVvZiB0aG91c2FuZHNfc2VwID09PSAndW5kZWZpbmVkJykgPyAnLCcgOiB0aG91c2FuZHNfc2VwLFxuICAgICAgICBkZWMgPSAodHlwZW9mIGRlY19wb2ludCA9PT0gJ3VuZGVmaW5lZCcpID8gJy4nIDogZGVjX3BvaW50LFxuICAgICAgICBzID0gJycsXG4gICAgICAgIHRvRml4ZWRGaXggPSBmdW5jdGlvbiAobiwgcHJlYykge1xuICAgICAgICAgICAgdmFyIGsgPSBNYXRoLnBvdygxMCwgcHJlYyk7XG4gICAgICAgICAgICByZXR1cm4gJycgKyBNYXRoLnJvdW5kKG4gKiBrKSAvIGs7XG4gICAgICAgIH07XG4gICAgLy8gRml4IGZvciBJRSBwYXJzZUZsb2F0KDAuNTUpLnRvRml4ZWQoMCkgPSAwO1xuICAgIHMgPSAocHJlYyA/IHRvRml4ZWRGaXgobiwgcHJlYykgOiAnJyArIE1hdGgucm91bmQobikpLnNwbGl0KCcuJyk7XG4gICAgaWYgKHNbMF0ubGVuZ3RoID4gMykge1xuICAgICAgICBzWzBdID0gc1swXS5yZXBsYWNlKC9cXEIoPz0oPzpcXGR7M30pKyg/IVxcZCkpL2csIHNlcCk7XG4gICAgfVxuICAgIGlmICgoc1sxXSB8fCAnJykubGVuZ3RoIDwgcHJlYykge1xuICAgICAgICBzWzFdID0gc1sxXSB8fCAnJztcbiAgICAgICAgc1sxXSArPSBuZXcgQXJyYXkocHJlYyAtIHNbMV0ubGVuZ3RoICsgMSkuam9pbignMCcpO1xuICAgIH1cbiAgICByZXR1cm4gcy5qb2luKGRlYyk7XG59O1xuXG5cbi8qKlxuICogRWxlbWVudC5jbG9zZXN0KCkgcG9seWZpbGxcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L2Nsb3Nlc3QjUG9seWZpbGxcbiAqL1xuaWYgKCFFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0KSB7XG4gICAgaWYgKCFFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzKSB7XG4gICAgICAgIEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMgPSBFbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3RvciB8fCBFbGVtZW50LnByb3RvdHlwZS53ZWJraXRNYXRjaGVzU2VsZWN0b3I7XG4gICAgfVxuICAgIEVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3QgPSBmdW5jdGlvbiAocykge1xuICAgICAgICB2YXIgZWwgPSB0aGlzO1xuICAgICAgICB2YXIgYW5jZXN0b3IgPSB0aGlzO1xuICAgICAgICBpZiAoIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyhlbCkpIHJldHVybiBudWxsO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoYW5jZXN0b3IubWF0Y2hlcyhzKSkgcmV0dXJuIGFuY2VzdG9yO1xuICAgICAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9IHdoaWxlIChhbmNlc3RvciAhPT0gbnVsbCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG59XG5cbndpbmRvdy5BamF4ID0ge1xuXG4gICAgLy9UT0RPOiBDYW4gd2UgY3JlYXRlIGEgcHJlcGFyZSByZXF1ZXN0IGZ1bmN0aW9uID8/XG5cbiAgICBnZXQ6IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBsZXQgdG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuY29udGVudDtcblxuICAgICAgICB4aHIub3BlbignZ2V0JywgdXJsLCB0cnVlKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLUNTUkYtVE9LRU4nLCB0b2tlbik7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLVJlcXVlc3RlZC1XaXRoJywgJ1hNTEh0dHBSZXF1ZXN0Jyk7XG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHhocik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSxcblxuICAgIHBvc3Q6IGZ1bmN0aW9uKHVybCwgZGF0YSwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBsZXQgdG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuY29udGVudDtcblxuICAgICAgICB4aHIub3BlbigncG9zdCcsIHVybCwgdHJ1ZSk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignWC1DU1JGLVRPS0VOJywgdG9rZW4pO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignWC1SZXF1ZXN0ZWQtV2l0aCcsICdYTUxIdHRwUmVxdWVzdCcpO1xuICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh4aHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB4aHIuc2VuZCggSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgIH0sXG5cbiAgICBwb3N0Rm9ybURhdGE6IGZ1bmN0aW9uKHVybCwgZGF0YSwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBsZXQgdG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuY29udGVudDtcblxuICAgICAgICB4aHIub3BlbigncG9zdCcsIHVybCwgdHJ1ZSk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLUNTUkYtVE9LRU4nLCB0b2tlbik7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLVJlcXVlc3RlZC1XaXRoJywgJ1hNTEh0dHBSZXF1ZXN0Jyk7XG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHhocik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHhoci5zZW5kKGRhdGEpO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBzdHJpbmdcbiAqIEBwYXJhbSBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbndpbmRvdy5jYXBpdGFsaXplRmlyc3RMZXR0ZXIgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbn07XG5cbi8qKlxuICogQ29udmVydCBzbmFrZSBjYXNlIGludG8gY2FtZWxjYXNlXG4gKlxuICogQHBhcmFtIHN0cmluZ1xuICogQHJldHVybnMgeyp9XG4gKi9cbndpbmRvdy5zbmFrZVRvQ2FtZWwgPSBmdW5jdGlvbiAoc3RyaW5nKXtcbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyhcXC1cXHcpL2csIGZ1bmN0aW9uKG0pe3JldHVybiBtWzFdLnRvVXBwZXJDYXNlKCk7fSk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgaW5kZXggb2YgYW4gZWxlbWVudCBpbnNpZGUgaXRzIHBhcmVudFxuICovXG53aW5kb3cuaW5kZXhJblBhcmVudD0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzO1xuICAgIGxldCBudW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldID09IG5vZGUpIHJldHVybiBudW07XG4gICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PSAxKSBudW0rKztcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufTtcblxuLyoqXG4gKiBGb3Igc2VjdXJpdHkgcmVhc29ucyBpT1MgU2FmYXJpIG9ubHkgYWxsb3dzIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5JykgZm9yIHRleHQgd2l0aGluIGEgY29udGVudEVkaXRhYmxlIGNvbnRhaW5lci5cbiAqIFRoZSB3b3JrYXJvdW5kIGlzIHRvIGRldGVjdCBpT1MgU2FmYXJpIGFuZCBxdWlja2x5IHRvZ2dsZSBjb250ZW50RWRpdGFibGUgYmVmb3JlIGV4ZWN1dGluZyBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpLlxuICogV2hlYiBpbnB1dCBvciB0ZXh0YXJlYSBpcyBSRUFET05MWSB5b3UgY2FuIHByZXZlbnQgdGhlIHVud2FudGVkIHBvcHVwIHdpdGggY29weS9wYXN0ZSBmdW5jdGlvbnMgYW5kIHRoZSBpbnB1dCBrZXlib2FyZFxuICogQ29kZSBmcm9tOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDY5ODE4NDdcbiAqL1xud2luZG93LmNvcHlUb0NsaXBib2FyZCA9IGZ1bmN0aW9uIChlbCkge1xuXG4gICAgLy8gcmVzb2x2ZSB0aGUgZWxlbWVudFxuICAgIGVsID0gKHR5cGVvZiBlbCA9PT0gJ3N0cmluZycpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCkgOiBlbDtcblxuICAgIC8vIGhhbmRsZSBpT1MgYXMgYSBzcGVjaWFsIGNhc2VcbiAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaXBhZHxpcG9kfGlwaG9uZS9pKSkge1xuXG4gICAgICAgIC8vIHNhdmUgY3VycmVudCBjb250ZW50RWRpdGFibGUvcmVhZE9ubHkgc3RhdHVzXG4gICAgICAgIGNvbnN0IGVkaXRhYmxlID0gZWwuY29udGVudEVkaXRhYmxlO1xuICAgICAgICBjb25zdCByZWFkT25seSA9IGVsLnJlYWRPbmx5O1xuXG4gICAgICAgIC8vIGNvbnZlcnQgdG8gZWRpdGFibGUgd2l0aCByZWFkb25seSB0byBzdG9wIGlPUyBrZXlib2FyZCBvcGVuaW5nXG4gICAgICAgIGVsLmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7XG4gICAgICAgIGVsLnJlYWRPbmx5ID0gdHJ1ZTtcblxuICAgICAgICAvLyBjcmVhdGUgYSBzZWxlY3RhYmxlIHJhbmdlXG4gICAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbCk7XG5cbiAgICAgICAgLy8gc2VsZWN0IHRoZSByYW5nZVxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgZWwuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgOTk5OTk5KTtcblxuICAgICAgICAvLyByZXN0b3JlIGNvbnRlbnRFZGl0YWJsZS9yZWFkT25seSB0byBvcmlnaW5hbCBzdGF0ZVxuICAgICAgICBlbC5jb250ZW50RWRpdGFibGUgPSBlZGl0YWJsZTtcbiAgICAgICAgZWwucmVhZE9ubHkgPSByZWFkT25seTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVsLnNlbGVjdCgpO1xuICAgIH1cblxuICAgIC8vIGV4ZWN1dGUgY29weSBjb21tYW5kXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCByZWxhdGVkIHRvIHRoZSBib2R5XG4gKlxuICogQHBhcmFtIGVsXG4gKiBAcmV0dXJucyB7e3RvcDogbnVtYmVyLCBsZWZ0OiBudW1iZXJ9fVxuICovXG53aW5kb3cuYm9keU9mZnNldCA9IGZ1bmN0aW9uIChlbCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgc2Nyb2xsTGVmdCA9IHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICAgICAgc2Nyb2xsVG9wID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XG4gICAgcmV0dXJuIHsgdG9wOiByZWN0LnRvcCArIHNjcm9sbFRvcCwgbGVmdDogcmVjdC5sZWZ0ICsgc2Nyb2xsTGVmdCB9XG59OyIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBTY3JvbGwgaGFuZGxlclxuICAgLSBIYW5kbGVyIHRoZSBvYmplY3RzIHdoaWNoIGFyZSBiaW5kIG9uIHNjcm9sbCBldmVudHMgb3IgdmlzaWJsZSBpbiB2aWV3cG9ydFxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IFNjcm9sbEhhbmRsZXIgPSB7XG5cbiAgICAvLyBWYXJpYWJsZXMgZm9yIGRlYm91bmNlIGFuZCB0aHJvdHRsZSBlZmZlY3RzXG4gICAgdGltZTogRGF0ZS5ub3coKSxcbiAgICB0aW1lb3V0OiBudWxsLFxuICAgIHdhaXRUaHJvdHRsZTogMTAwMCxcbiAgICB3YWl0RGVib3VuY2U6IDMwMCxcblxuICAgIC8vIFZhcmlhYmxlcyBmb3Igc2Nyb2xsIGRpcmVjdGlvblxuICAgIGxhc3RTY3JvbGxUb3BQb3NpdGlvbjogMCxcbiAgICBzY3JvbGxEaXJlY3Rpb25Eb3duOiB0cnVlLFxuICAgIHNjcm9sbERpcmVjdGlvblVwOiBmYWxzZSxcblxuICAgIC8vSW5pdGlhbGlzYXRpb25cbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy8gVHJpZ2dlciBzdGFydCBvbiBzdGFydCB1cFxuICAgICAgICBTY3JvbGxIYW5kbGVyLnRyaWdnZXJPbkluaXQoKTtcblxuICAgICAgICAvLyBUaHJvdHRsZSBzY3JvbGxcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICgoU2Nyb2xsSGFuZGxlci50aW1lICsgU2Nyb2xsSGFuZGxlci53YWl0VGhyb3R0bGUgLSBEYXRlLm5vdygpKSA8IDApIHtcbiAgICAgICAgICAgICAgICBTY3JvbGxIYW5kbGVyLnRyaWdnZXJUaHJvdHRsZSgpO1xuICAgICAgICAgICAgICAgIFNjcm9sbEhhbmRsZXIudGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNtb290aCBzY3JvbGxcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFNjcm9sbEhhbmRsZXIudHJpZ2dlclNtb290aCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBEZWJvdW5jZSBzY3JvbGxcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmKGlzc2V0KFNjcm9sbEhhbmRsZXIudGltZW91dCkpIGNsZWFyVGltZW91dChTY3JvbGxIYW5kbGVyLnRpbWVvdXQpO1xuICAgICAgICAgICAgU2Nyb2xsSGFuZGxlci50aW1lb3V0ID0gc2V0VGltZW91dChTY3JvbGxIYW5kbGVyLnRyaWdnZXJEZWJvdW5jZSwgU2Nyb2xsSGFuZGxlci53YWl0RGVib3VuY2UpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gVHJpZ2dlciBvbiBzdGFydCB1cFxuICAgIHRyaWdnZXJPbkluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgU2Nyb2xsSGFuZGxlci50cmlnZ2VyRWxlbWVudEluVmlld3BvcnRBbmltYXRpb24oKTtcbiAgICB9LFxuXG4gICAgLy8gVHJpZ2dlciBzY3JvbGwgZnVuY3Rpb25zIHdpdGggdGhyb3R0bGUgKHByZWZlcnJlZClcbiAgICB0cmlnZ2VyVGhyb3R0bGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1Rocm90dGxlZCBzY3JvbGwnKTtcbiAgICAgICAgU2Nyb2xsSGFuZGxlci50cmlnZ2VyRWxlbWVudEluVmlld3BvcnRBbmltYXRpb24oKTtcbiAgICB9LFxuXG4gICAgLy8gVHJpZ2dlciBzY3JvbGwgb24gZGVib3VuY2VcbiAgICB0cmlnZ2VyRGVib3VuY2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ0RlYm91bmNlIHNjcm9sbCcpO1xuICAgIH0sXG5cbiAgICAvLyBUcmlnZ2VyIHNjcm9sbCBvbiB0aGUgZmxpZ2h0XG4gICAgdHJpZ2dlclNtb290aDogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnU21vb3RoIHNjcm9sbCcpO1xuICAgICAgICBTY3JvbGxIYW5kbGVyLmRldGVjdFNjcm9sbERpcmVjdGlvbigpO1xuICAgICAgICBTY3JvbGxIYW5kbGVyLnRvZ2dsZVN0aWNreUhlYWRlcigpO1xuICAgIH0sXG5cbiAgICAvLyBEZXRlY3QgaWYgcGFydCBvZiBhIGdpdmVuIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcbiAgICAvLyBFbCBtdXN0IGJlIGEgbm9kZSBlbGVtZW50XG4gICAgZGV0ZWN0SWZFbGVtZW50SXNQYXJ0bHlJblZpZXdwb3J0OiBmdW5jdGlvbihlbClcbiAgICB7XG4gICAgICAgIGlmKGlzc2V0KGVsKSl7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIC8vIERPTVJlY3QgeyB4OiA4LCB5OiA4LCB3aWR0aDogMTAwLCBoZWlnaHQ6IDEwMCwgdG9wOiA4LCByaWdodDogMTA4LCBib3R0b206IDEwOCwgbGVmdDogOCB9XG4gICAgICAgICAgICBjb25zdCB3aW5kb3dIZWlnaHQgPSAod2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpO1xuICAgICAgICAgICAgY29uc3Qgd2luZG93V2lkdGggPSAod2luZG93LmlubmVyV2lkdGggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTtcblxuICAgICAgICAgICAgY29uc3QgdmVydGljYWxJblZpZXcgPSAocmVjdC50b3AgPD0gKHdpbmRvd0hlaWdodCkpICYmICgocmVjdC50b3AgKyByZWN0LmhlaWdodCkgPj0gMCk7XG4gICAgICAgICAgICBjb25zdCBob3Jpem9udGFsSW5WaWV3ID0gKHJlY3QubGVmdCA8PSB3aW5kb3dXaWR0aCkgJiYgKChyZWN0LmxlZnQgKyByZWN0LndpZHRoKSA+PSAwKTtcblxuICAgICAgICAgICAgcmV0dXJuICh2ZXJ0aWNhbEluVmlldyAmJiBob3Jpem9udGFsSW5WaWV3KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBEZXRlY3QgaWYgYSBnaXZlbiBlbGVtZW50IGlzIGZ1bGx5IHZpc2libGUgaW4gdGhlIHZpZXdwb3J0XG4gICAgLy8gRWwgbXVzdCBiZSBhIG5vZGUgZWxlbWVudFxuICAgIGRldGVjdElmRWxlbWVudElzRnVsbHlJblZpZXdwb3J0OiBmdW5jdGlvbihlbClcbiAgICB7XG4gICAgICAgIGlmKGlzc2V0KGVsKSl7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgcmVjdC50b3AgPj0gMCAmJlxuICAgICAgICAgICAgICAgIHJlY3QuYm90dG9tIDw9IHdpbmRvdy5pbm5lckhlaWdodFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBkZXRlY3RTY3JvbGxEaXJlY3Rpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsVG9wUG9zaXRpb24gPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsgLy8gQ3JlZGl0czogXCJodHRwczovL2dpdGh1Yi5jb20vcWVyZW15L3NvL2Jsb2IvbWFzdGVyL3NvLmRvbS5qcyNMNDI2XCJcbiAgICAgICAgaWYgKHNjcm9sbFRvcFBvc2l0aW9uID49IFNjcm9sbEhhbmRsZXIubGFzdFNjcm9sbFRvcFBvc2l0aW9uKXtcbiAgICAgICAgICAgIFNjcm9sbEhhbmRsZXIuc2Nyb2xsRGlyZWN0aW9uRG93biA9IHRydWU7XG4gICAgICAgICAgICBTY3JvbGxIYW5kbGVyLnNjcm9sbERpcmVjdGlvblVwID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTY3JvbGxIYW5kbGVyLnNjcm9sbERpcmVjdGlvbkRvd24gPSBmYWxzZTtcbiAgICAgICAgICAgIFNjcm9sbEhhbmRsZXIuc2Nyb2xsRGlyZWN0aW9uVXAgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIFNjcm9sbEhhbmRsZXIubGFzdFNjcm9sbFRvcFBvc2l0aW9uID0gc2Nyb2xsVG9wUG9zaXRpb247XG4gICAgfSxcblxuICAgIC8vIFRyaWdnZXIgYW5pbWF0aW9uIG9uIGVsZW1lbnRzIHRoYXQgaGF2ZSAnZWxlbWVudC1pbi12aWV3cG9ydCcgYW5kIHRoYXQgYXJlIGluIHRoZSB2aWV3cG9ydFxuICAgIC8vIFRoZXNlIGFuaW1hdGlvbiBjYW4gb25seSBiZSB0cmlnZ2VyZWQgb25jZSwgaWYgeW91IHdhbnQgbW9yZSB0aGVuIHRoYXQgeW91IHNob3VsZCB3cml0ZSBhbiBzcGVjaWZpYyBmdW5jdGlvbiBmb3IgdGhpc1xuICAgIHRyaWdnZXJFbGVtZW50SW5WaWV3cG9ydEFuaW1hdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5lbGVtZW50LWluLXZpZXdwb3J0Jyk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzTGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoO1xuXG4gICAgICAgIGZvcihsZXQgZSA9IDA7IGUgPCBlbGVtZW50c0xlbmd0aDsgZSsrKXtcblxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW2VdO1xuICAgICAgICAgICAgaWYoU2Nyb2xsSGFuZGxlci5kZXRlY3RJZkVsZW1lbnRJc1BhcnRseUluVmlld3BvcnQoZWxlbWVudCkpe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZWxlbWVudC1pbi12aWV3cG9ydCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9LFxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENVU1RPTSBTQ1JPTEwgSEFORExFUlMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvLyBIaWRlIG9yIHNob3cgc3RpY2t5IG5hdmlnYXRpb24gd2hlbiBoZWFkZXIgaXNuJ3QgdmlzaWJsZVxuICAgIHRvZ2dsZVN0aWNreUhlYWRlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzdGlja3lIZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtc3RpY2t5LWhlYWRlcicpO1xuICAgICAgICBjb25zdCB2aXNpYmxlU3RpY2t5SGVhZGVyQ2xhc3MgPSAnaXMtc3RpY2t5LWhlYWRlci12aXNpYmxlJztcbiAgICAgICAgY29uc3Qgc3VibmF2TGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1zdWJuYXYnKTtcbiAgICAgICAgdmFyIHN1Yk5hdklzVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICBzdGlja3lIZWFkZXIuaGlkZGVuID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJuYXZMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUoc3VibmF2TGlzdFtpXSwgbnVsbCkudmlzaWJpbGl0eSA9PSBcInZpc2libGVcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWJOYXZJc1Zpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoaXNzZXQoc3RpY2t5SGVhZGVyKSAmJiAhc3ViTmF2SXNWaXNpYmxlKXtcbiAgICAgICAgICAgIC8vIEhpZGUgd2hlbiBzY3JvbGxpbmcgRE9XTiAoT1Igd2l0aGluIG9mZnNldClcbiAgICAgICAgICAgIGlmKFNjcm9sbEhhbmRsZXIuc2Nyb2xsRGlyZWN0aW9uRG93biB8fCBTY3JvbGxIYW5kbGVyLmxhc3RTY3JvbGxUb3BQb3NpdGlvbiA8IDExMCl7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKHZpc2libGVTdGlja3lIZWFkZXJDbGFzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTaG93IHdoZW4gc2Nyb2xsaW5nIFVQIGFuZCBvdXRzaWRlIG9mIG9mZnNldFxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKHZpc2libGVTdGlja3lIZWFkZXJDbGFzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG59O1xuXG5TY3JvbGxIYW5kbGVyLmluaXQoKTsiLCIvLyByZW1vdmVkIGJ5IGV4dHJhY3QtdGV4dC13ZWJwYWNrLXBsdWdpbiIsIi8vIHJlbW92ZWQgYnkgZXh0cmFjdC10ZXh0LXdlYnBhY2stcGx1Z2luIl0sInNvdXJjZVJvb3QiOiIifQ==