Greasy Fork is available in English.

Eldarya Enhancements

Повышает удобство использования Эльдарьи.

Устаревшая версия на 27.02.2022. Перейти к последней версии.

// ==UserScript==
// @name            Eldarya Enhancements
// @namespace       https://gitlab.com/NatoBoram/eldarya-enhancements
// @license         GPL-3.0-or-later
// @version         1.2.15
// @author          Nato Boram
// @description     Enhances the user experience of Eldarya.
// @description:pt  Aprimora a experiência do usuário de Eldarya.
// @description:de  Verbessert die Benutzererfahrung von Eldarya.
// @description:es  Mejora la experiencia del usuario de Eldarya.
// @description:hu  Javítja az Eldarya felhasználói élményét.
// @description:it  Migliora l'esperienza utente di Eldarya.
// @description:pl  Zwiększa wrażenia użytkownika Eldaryi.
// @description:ru  Повышает удобство использования Эльдарьи.
// @description:en  Enhances the user experience of Eldarya.
// @description:fr  Améliore l'expérience utilisateur d'Eldarya.
// @icon            https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/avatar.png
// @supportURL      https://gitlab.com/NatoBoram/eldarya-enhancements/-/issues
// @contributionURL https://paypal.me/NatoBoram/5
//
// @match https://www.eldarya.com.br/*
// @match https://www.eldarya.de/*
// @match https://www.eldarya.es/*
// @match https://www.eldarya.hu/*
// @match https://www.eldarya.it/*
// @match https://www.eldarya.pl/*
// @match https://www.eldarya.ru/*
// @match https://www.eldarya.com/*
// @match https://www.eldarya.fr/*
//
// @grant none
// ==/UserScript==

/******/ ;(() => {
  // webpackBootstrap
  /******/ var __webpack_modules__ = {
    /***/ "./node_modules/.pnpm/blob-util@2.0.2/node_modules/blob-util/dist/blob-util.es.js":
      /*!****************************************************************************************!*\
  !*** ./node_modules/.pnpm/blob-util@2.0.2/node_modules/blob-util/dist/blob-util.es.js ***!
  \****************************************************************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ createBlob: () => /* binding */ createBlob,
          /* harmony export */ createObjectURL: () =>
            /* binding */ createObjectURL,
          /* harmony export */ revokeObjectURL: () =>
            /* binding */ revokeObjectURL,
          /* harmony export */ blobToBinaryString: () =>
            /* binding */ blobToBinaryString,
          /* harmony export */ base64StringToBlob: () =>
            /* binding */ base64StringToBlob,
          /* harmony export */ binaryStringToBlob: () =>
            /* binding */ binaryStringToBlob,
          /* harmony export */ blobToBase64String: () =>
            /* binding */ blobToBase64String,
          /* harmony export */ dataURLToBlob: () => /* binding */ dataURLToBlob,
          /* harmony export */ blobToDataURL: () => /* binding */ blobToDataURL,
          /* harmony export */ imgSrcToDataURL: () =>
            /* binding */ imgSrcToDataURL,
          /* harmony export */ canvasToBlob: () => /* binding */ canvasToBlob,
          /* harmony export */ imgSrcToBlob: () => /* binding */ imgSrcToBlob,
          /* harmony export */ arrayBufferToBlob: () =>
            /* binding */ arrayBufferToBlob,
          /* harmony export */ blobToArrayBuffer: () =>
            /* binding */ blobToArrayBuffer,
          /* harmony export */ arrayBufferToBinaryString: () =>
            /* binding */ arrayBufferToBinaryString,
          /* harmony export */ binaryStringToArrayBuffer: () =>
            /* binding */ binaryStringToArrayBuffer,
          /* harmony export */
        })
        // TODO: including these in blob-util.ts causes typedoc to generate docs for them,
        // even with --excludePrivate ¯\_(ツ)_/¯
        /** @private */
        function loadImage(src, crossOrigin) {
          return new Promise(function (resolve, reject) {
            var img = new Image()
            if (crossOrigin) {
              img.crossOrigin = crossOrigin
            }
            img.onload = function () {
              resolve(img)
            }
            img.onerror = reject
            img.src = src
          })
        }
        /** @private */
        function imgToCanvas(img) {
          var canvas = document.createElement("canvas")
          canvas.width = img.width
          canvas.height = img.height
          // copy the image contents to the canvas
          var context = canvas.getContext("2d")
          context.drawImage(
            img,
            0,
            0,
            img.width,
            img.height,
            0,
            0,
            img.width,
            img.height
          )
          return canvas
        }

        /* global Promise, Image, Blob, FileReader, atob, btoa,
   BlobBuilder, MSBlobBuilder, MozBlobBuilder, WebKitBlobBuilder, webkitURL */
        /**
         * Shim for
         * [`new Blob()`](https://developer.mozilla.org/en-US/docs/Web/API/Blob.Blob)
         * to support
         * [older browsers that use the deprecated `BlobBuilder` API](http://caniuse.com/blob).
         *
         * Example:
         *
         * ```js
         * var myBlob = blobUtil.createBlob(['hello world'], {type: 'text/plain'});
         * ```
         *
         * @param parts - content of the Blob
         * @param properties - usually `{type: myContentType}`,
         *                           you can also pass a string for the content type
         * @returns Blob
         */
        function createBlob(parts, properties) {
          parts = parts || []
          properties = properties || {}
          if (typeof properties === "string") {
            properties = { type: properties } // infer content type
          }
          try {
            return new Blob(parts, properties)
          } catch (e) {
            if (e.name !== "TypeError") {
              throw e
            }
            var Builder =
              typeof BlobBuilder !== "undefined"
                ? BlobBuilder
                : typeof MSBlobBuilder !== "undefined"
                ? MSBlobBuilder
                : typeof MozBlobBuilder !== "undefined"
                ? MozBlobBuilder
                : WebKitBlobBuilder
            var builder = new Builder()
            for (var i = 0; i < parts.length; i += 1) {
              builder.append(parts[i])
            }
            return builder.getBlob(properties.type)
          }
        }
        /**
         * Shim for
         * [`URL.createObjectURL()`](https://developer.mozilla.org/en-US/docs/Web/API/URL.createObjectURL)
         * to support browsers that only have the prefixed
         * `webkitURL` (e.g. Android <4.4).
         *
         * Example:
         *
         * ```js
         * var myUrl = blobUtil.createObjectURL(blob);
         * ```
         *
         * @param blob
         * @returns url
         */
        function createObjectURL(blob) {
          return (typeof URL !== "undefined" ? URL : webkitURL).createObjectURL(
            blob
          )
        }
        /**
         * Shim for
         * [`URL.revokeObjectURL()`](https://developer.mozilla.org/en-US/docs/Web/API/URL.revokeObjectURL)
         * to support browsers that only have the prefixed
         * `webkitURL` (e.g. Android <4.4).
         *
         * Example:
         *
         * ```js
         * blobUtil.revokeObjectURL(myUrl);
         * ```
         *
         * @param url
         */
        function revokeObjectURL(url) {
          return (typeof URL !== "undefined" ? URL : webkitURL).revokeObjectURL(
            url
          )
        }
        /**
         * Convert a `Blob` to a binary string.
         *
         * Example:
         *
         * ```js
         * blobUtil.blobToBinaryString(blob).then(function (binaryString) {
         *   // success
         * }).catch(function (err) {
         *   // error
         * });
         * ```
         *
         * @param blob
         * @returns Promise that resolves with the binary string
         */
        function blobToBinaryString(blob) {
          return new Promise(function (resolve, reject) {
            var reader = new FileReader()
            var hasBinaryString =
              typeof reader.readAsBinaryString === "function"
            reader.onloadend = function () {
              var result = reader.result || ""
              if (hasBinaryString) {
                return resolve(result)
              }
              resolve(arrayBufferToBinaryString(result))
            }
            reader.onerror = reject
            if (hasBinaryString) {
              reader.readAsBinaryString(blob)
            } else {
              reader.readAsArrayBuffer(blob)
            }
          })
        }
        /**
         * Convert a base64-encoded string to a `Blob`.
         *
         * Example:
         *
         * ```js
         * var blob = blobUtil.base64StringToBlob(base64String);
         * ```
         * @param base64 - base64-encoded string
         * @param type - the content type (optional)
         * @returns Blob
         */
        function base64StringToBlob(base64, type) {
          var parts = [binaryStringToArrayBuffer(atob(base64))]
          return type ? createBlob(parts, { type: type }) : createBlob(parts)
        }
        /**
         * Convert a binary string to a `Blob`.
         *
         * Example:
         *
         * ```js
         * var blob = blobUtil.binaryStringToBlob(binaryString);
         * ```
         *
         * @param binary - binary string
         * @param type - the content type (optional)
         * @returns Blob
         */
        function binaryStringToBlob(binary, type) {
          return base64StringToBlob(btoa(binary), type)
        }
        /**
         * Convert a `Blob` to a binary string.
         *
         * Example:
         *
         * ```js
         * blobUtil.blobToBase64String(blob).then(function (base64String) {
         *   // success
         * }).catch(function (err) {
         *   // error
         * });
         * ```
         *
         * @param blob
         * @returns Promise that resolves with the binary string
         */
        function blobToBase64String(blob) {
          return blobToBinaryString(blob).then(btoa)
        }
        /**
         * Convert a data URL string
         * (e.g. `'data:image/png;base64,iVBORw0KG...'`)
         * to a `Blob`.
         *
         * Example:
         *
         * ```js
         * var blob = blobUtil.dataURLToBlob(dataURL);
         * ```
         *
         * @param dataURL - dataURL-encoded string
         * @returns Blob
         */
        function dataURLToBlob(dataURL) {
          var type = dataURL.match(/data:([^;]+)/)[1]
          var base64 = dataURL.replace(/^[^,]+,/, "")
          var buff = binaryStringToArrayBuffer(atob(base64))
          return createBlob([buff], { type: type })
        }
        /**
         * Convert a `Blob` to a data URL string
         * (e.g. `'data:image/png;base64,iVBORw0KG...'`).
         *
         * Example:
         *
         * ```js
         * var dataURL = blobUtil.blobToDataURL(blob);
         * ```
         *
         * @param blob
         * @returns Promise that resolves with the data URL string
         */
        function blobToDataURL(blob) {
          return blobToBase64String(blob).then(function (base64String) {
            return "data:" + blob.type + ";base64," + base64String
          })
        }
        /**
         * Convert an image's `src` URL to a data URL by loading the image and painting
         * it to a `canvas`.
         *
         * Note: this will coerce the image to the desired content type, and it
         * will only paint the first frame of an animated GIF.
         *
         * Examples:
         *
         * ```js
         * blobUtil.imgSrcToDataURL('http://mysite.com/img.png').then(function (dataURL) {
         *   // success
         * }).catch(function (err) {
         *   // error
         * });
         * ```
         *
         * ```js
         * blobUtil.imgSrcToDataURL('http://some-other-site.com/img.jpg', 'image/jpeg',
         *                          'Anonymous', 1.0).then(function (dataURL) {
         *   // success
         * }).catch(function (err) {
         *   // error
         * });
         * ```
         *
         * @param src - image src
         * @param type - the content type (optional, defaults to 'image/png')
         * @param crossOrigin - for CORS-enabled images, set this to
         *                                         'Anonymous' to avoid "tainted canvas" errors
         * @param quality - a number between 0 and 1 indicating image quality
         *                                     if the requested type is 'image/jpeg' or 'image/webp'
         * @returns Promise that resolves with the data URL string
         */
        function imgSrcToDataURL(src, type, crossOrigin, quality) {
          type = type || "image/png"
          return loadImage(src, crossOrigin)
            .then(imgToCanvas)
            .then(function (canvas) {
              return canvas.toDataURL(type, quality)
            })
        }
        /**
         * Convert a `canvas` to a `Blob`.
         *
         * Examples:
         *
         * ```js
         * blobUtil.canvasToBlob(canvas).then(function (blob) {
         *   // success
         * }).catch(function (err) {
         *   // error
         * });
         * ```
         *
         * Most browsers support converting a canvas to both `'image/png'` and `'image/jpeg'`. You may
         * also want to try `'image/webp'`, which will work in some browsers like Chrome (and in other browsers, will just fall back to `'image/png'`):
         *
         * ```js
         * blobUtil.canvasToBlob(canvas, 'image/webp').then(function (blob) {
         *   // success
         * }).catch(function (err) {
         *   // error
         * });
         * ```
         *
         * @param canvas - HTMLCanvasElement
         * @param type - the content type (optional, defaults to 'image/png')
         * @param quality - a number between 0 and 1 indicating image quality
         *                                     if the requested type is 'image/jpeg' or 'image/webp'
         * @returns Promise that resolves with the `Blob`
         */
        function canvasToBlob(canvas, type, quality) {
          if (typeof canvas.toBlob === "function") {
            return new Promise(function (resolve) {
              canvas.toBlob(resolve, type, quality)
            })
          }
          return Promise.resolve(dataURLToBlob(canvas.toDataURL(type, quality)))
        }
        /**
         * Convert an image's `src` URL to a `Blob` by loading the image and painting
         * it to a `canvas`.
         *
         * Note: this will coerce the image to the desired content type, and it
         * will only paint the first frame of an animated GIF.
         *
         * Examples:
         *
         * ```js
         * blobUtil.imgSrcToBlob('http://mysite.com/img.png').then(function (blob) {
         *   // success
         * }).catch(function (err) {
         *   // error
         * });
         * ```
         *
         * ```js
         * blobUtil.imgSrcToBlob('http://some-other-site.com/img.jpg', 'image/jpeg',
         *                          'Anonymous', 1.0).then(function (blob) {
         *   // success
         * }).catch(function (err) {
         *   // error
         * });
         * ```
         *
         * @param src - image src
         * @param type - the content type (optional, defaults to 'image/png')
         * @param crossOrigin - for CORS-enabled images, set this to
         *                                         'Anonymous' to avoid "tainted canvas" errors
         * @param quality - a number between 0 and 1 indicating image quality
         *                                     if the requested type is 'image/jpeg' or 'image/webp'
         * @returns Promise that resolves with the `Blob`
         */
        function imgSrcToBlob(src, type, crossOrigin, quality) {
          type = type || "image/png"
          return loadImage(src, crossOrigin)
            .then(imgToCanvas)
            .then(function (canvas) {
              return canvasToBlob(canvas, type, quality)
            })
        }
        /**
         * Convert an `ArrayBuffer` to a `Blob`.
         *
         * Example:
         *
         * ```js
         * var blob = blobUtil.arrayBufferToBlob(arrayBuff, 'audio/mpeg');
         * ```
         *
         * @param buffer
         * @param type - the content type (optional)
         * @returns Blob
         */
        function arrayBufferToBlob(buffer, type) {
          return createBlob([buffer], type)
        }
        /**
         * Convert a `Blob` to an `ArrayBuffer`.
         *
         * Example:
         *
         * ```js
         * blobUtil.blobToArrayBuffer(blob).then(function (arrayBuff) {
         *   // success
         * }).catch(function (err) {
         *   // error
         * });
         * ```
         *
         * @param blob
         * @returns Promise that resolves with the `ArrayBuffer`
         */
        function blobToArrayBuffer(blob) {
          return new Promise(function (resolve, reject) {
            var reader = new FileReader()
            reader.onloadend = function () {
              var result = reader.result || new ArrayBuffer(0)
              resolve(result)
            }
            reader.onerror = reject
            reader.readAsArrayBuffer(blob)
          })
        }
        /**
         * Convert an `ArrayBuffer` to a binary string.
         *
         * Example:
         *
         * ```js
         * var myString = blobUtil.arrayBufferToBinaryString(arrayBuff)
         * ```
         *
         * @param buffer - array buffer
         * @returns binary string
         */
        function arrayBufferToBinaryString(buffer) {
          var binary = ""
          var bytes = new Uint8Array(buffer)
          var length = bytes.byteLength
          var i = -1
          while (++i < length) {
            binary += String.fromCharCode(bytes[i])
          }
          return binary
        }
        /**
         * Convert a binary string to an `ArrayBuffer`.
         *
         * ```js
         * var myBuffer = blobUtil.binaryStringToArrayBuffer(binaryString)
         * ```
         *
         * @param binary - binary string
         * @returns array buffer
         */
        function binaryStringToArrayBuffer(binary) {
          var length = binary.length
          var buf = new ArrayBuffer(length)
          var arr = new Uint8Array(buf)
          var i = -1
          while (++i < length) {
            arr[i] = binary.charCodeAt(i)
          }
          return buf
        }

        /***/
      },

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

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

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

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

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

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

              return isAllWhitespace
            }

            function filterLine(haveSeenTag, noNewLine) {
              addBuf()

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

              seenTag = false
              lineStart = tokens.length
            }

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

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

              return closeIndex + close.length - 1
            }

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

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

            filterLine(seenTag, true)

            return tokens
          }

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

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

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

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

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

            return true
          }

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

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

            tail = stack[stack.length - 1]

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

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

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

              instructions.push(token)
            }

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

            return instructions
          }

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

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

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

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

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

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

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

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

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

          Hogan.template = Hogan.Template

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

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

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

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

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

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

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

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

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

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

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

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

            "{": tripleStache,

            "&": tripleStache,
          }

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

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

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

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

          Hogan.cache = {}

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

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

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

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

        /***/
      },

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

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

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

        /***/
      },

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

        var Hogan = {}

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

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

            // variable escaping
            v: hoganEscape,

            // triple stache
            t: coerceToString,

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

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

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

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

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

              if (!template) {
                return null
              }

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

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

              return template
            },

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

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

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

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

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

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

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

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

              pass = !!val

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

              return pass
            },

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

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

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

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

              return val
            },

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

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

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

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

              return val
            },

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

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

              return false
            },

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

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

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

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

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

              return result
            },

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

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

              return result
            },

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

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

            if (scope && typeof scope == "object") {
              if (scope[key] !== undefined) {
                val = scope[key]

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

            return val
          }

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

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

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

            return partial
          }

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

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

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

          var isArray =
            Array.isArray ||
            function (a) {
              return Object.prototype.toString.call(a) === "[object Array]"
            }
        })(true ? exports : 0)

        /***/
      },

    /***/ "./src/templates/html/appearance_item.html":
      /*!*************************************************!*\
  !*** ./src/templates/html/appearance_item.html ***!
  \*************************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b("<li")
                t.b("\n" + i)
                t.b('  id="appearance-item-')
                t.b(t.v(t.f("itemid", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b('  class="appearance-item group-')
                t.b(t.v(t.f("group", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b('  data-itemid="')
                t.b(t.v(t.f("itemid", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b('  data-name="')
                t.b(t.v(t.f("name", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b('  data-rarity="')
                t.b(t.v(t.f("rarity", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b('  data-rarityname="')
                t.b(t.v(t.f("rarityname", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b(">")
                t.b("\n" + i)
                t.b('  <div class="rarity-marker-')
                t.b(t.v(t.f("rarity", c, p, 0)))
                t.b('"></div>')
                t.b("\n" + i)
                t.b('  <img class="appearance-item-icon" src="')
                t.b(t.v(t.f("icon", c, p, 0)))
                t.b('" />')
                t.b("\n" + i)
                t.b("</li>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            '<li\n  id="appearance-item-{{itemid}}"\n  class="appearance-item group-{{group}}"\n  data-itemid="{{itemid}}"\n  data-name="{{name}}"\n  data-rarity="{{rarity}}"\n  data-rarityname="{{rarityname}}"\n>\n  <div class="rarity-marker-{{rarity}}"></div>\n  <img class="appearance-item-icon" src="{{icon}}" />\n</li>\n',
            H
          )
          return T
        })()

        /***/
      },

    /***/ "./src/templates/html/appearance_items_category.html":
      /*!***********************************************************!*\
  !*** ./src/templates/html/appearance_items_category.html ***!
  \***********************************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b("<div")
                t.b("\n" + i)
                t.b('  id="ee-category"')
                t.b("\n" + i)
                t.b('  class="appearance-items-category active"')
                t.b("\n" + i)
                t.b('  data-category="')
                t.b(t.v(t.f("category", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b('  data-categoryid="')
                t.b(t.v(t.f("categoryid", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b(">")
                t.b("\n" + i)
                t.b("  <style>")
                t.b("\n" + i)
                t.b("    #ee-items {")
                t.b("\n" + i)
                t.b("      scrollbar-color: dark;")
                t.b("\n" + i)
                t.b("      scrollbar-width: thin;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n" + i)
                t.b("  </style>")
                t.b("\n" + i)
                t.b("  <ul")
                t.b("\n" + i)
                t.b('    class="appearance-items-list"')
                t.b("\n" + i)
                t.b('    id="ee-items"')
                t.b("\n" + i)
                t.b('    style="max-height: calc(100vh - 565px)"')
                t.b("\n" + i)
                t.b("  >")
                t.b("\n" + i)
                t.b("    ")
                t.b(t.t(t.f("items", c, p, 0)))
                t.b("\n" + i)
                t.b("  </ul>")
                t.b("\n")
                t.b("\n" + i)
                t.b("  <!-- Info -->")
                t.b("\n" + i)
                t.b('  <div id="ee-info" class="appearance-items-info">')
                t.b("\n" + i)
                t.b('    <div class="appearance-info-tips"></div>')
                t.b("\n")
                t.b("\n" + i)
                t.b('    <h3 class="appearance-item-info-name"></h3>')
                t.b("\n")
                t.b("\n" + i)
                t.b('    <div class="appearance-item-info-guard"></div>')
                t.b("\n" + i)
                t.b('    <div class="appearance-item-info-rarity"></div>')
                t.b("\n" + i)
                t.b('    <div class="appearance-item-info-buttons">')
                t.b("\n" + i)
                t.b('      <div class="appearance-forward nl-button">')
                t.b("\n" + i)
                t.b("        ")
                t.b(t.v(t.d("translate.appearance.buttons.forward", c, p, 0)))
                t.b("\n" + i)
                t.b("      </div>")
                t.b("\n" + i)
                t.b('      <div class="appearance-backward nl-button">')
                t.b("\n" + i)
                t.b("        ")
                t.b(t.v(t.d("translate.appearance.buttons.backward", c, p, 0)))
                t.b("\n" + i)
                t.b("      </div>")
                t.b("\n" + i)
                t.b("    </div>")
                t.b("\n" + i)
                t.b("  </div>")
                t.b("\n" + i)
                t.b("</div>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            '<div\n  id="ee-category"\n  class="appearance-items-category active"\n  data-category="{{category}}"\n  data-categoryid="{{categoryid}}"\n>\n  <style>\n    #ee-items {\n      scrollbar-color: dark;\n      scrollbar-width: thin;\n    }\n  </style>\n  <ul\n    class="appearance-items-list"\n    id="ee-items"\n    style="max-height: calc(100vh - 565px)"\n  >\n    {{{items}}}\n  </ul>\n\n  <!-- Info -->\n  <div id="ee-info" class="appearance-items-info">\n    <div class="appearance-info-tips"></div>\n\n    <h3 class="appearance-item-info-name"></h3>\n\n    <div class="appearance-item-info-guard"></div>\n    <div class="appearance-item-info-rarity"></div>\n    <div class="appearance-item-info-buttons">\n      <div class="appearance-forward nl-button">\n        {{translate.appearance.buttons.forward}}\n      </div>\n      <div class="appearance-backward nl-button">\n        {{translate.appearance.buttons.backward}}\n      </div>\n    </div>\n  </div>\n</div>\n',
            H
          )
          return T
        })()

        /***/
      },

    /***/ "./src/templates/html/appearance_items_group.html":
      /*!********************************************************!*\
  !*** ./src/templates/html/appearance_items_group.html ***!
  \********************************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b("<div")
                t.b("\n" + i)
                t.b('  id="appearance-items-group-')
                t.b(t.v(t.f("group", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b('  class="appearance-items-category"')
                t.b("\n" + i)
                t.b('  data-categoryid="')
                t.b(t.v(t.f("categoryid", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b('  data-category="')
                t.b(t.v(t.f("category", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b(">")
                t.b("\n" + i)
                t.b('  <ul class="appearance-items-list">')
                t.b("\n" + i)
                t.b("    ")
                t.b(t.t(t.f("items", c, p, 0)))
                t.b("\n" + i)
                t.b("  </ul>")
                t.b("\n" + i)
                t.b("</div>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            '<div\n  id="appearance-items-group-{{group}}"\n  class="appearance-items-category"\n  data-categoryid="{{categoryid}}"\n  data-category="{{category}}"\n>\n  <ul class="appearance-items-list">\n    {{{items}}}\n  </ul>\n</div>\n',
            H
          )
          return T
        })()

        /***/
      },

    /***/ "./src/templates/html/auto_buy_button.html":
      /*!*************************************************!*\
  !*** ./src/templates/html/auto_buy_button.html ***!
  \*************************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b("<div")
                t.b("\n" + i)
                t.b('  id="marketplace-itemDetail-info-autobuy"')
                t.b("\n" + i)
                t.b('  style="text-align: center; margin: 20px auto"')
                t.b("\n" + i)
                t.b(">")
                t.b("\n" + i)
                t.b('  <div class="nl-button">')
                t.b(t.v(t.d("translate.market.add_to_wishlist.title", c, p, 0)))
                t.b("</div>")
                t.b("\n" + i)
                t.b("</div>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            '<div\n  id="marketplace-itemDetail-info-autobuy"\n  style="text-align: center; margin: 20px auto"\n>\n  <div class="nl-button">{{translate.market.add_to_wishlist.title}}</div>\n</div>\n',
            H
          )
          return T
        })()

        /***/
      },

    /***/ "./src/templates/html/auto_buy_flavr.html":
      /*!************************************************!*\
  !*** ./src/templates/html/auto_buy_flavr.html ***!
  \************************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b("<h1>")
                t.b(t.v(t.d("translate.market.add_to_wishlist.title", c, p, 0)))
                t.b("</h1>")
                t.b("\n" + i)
                t.b("<p>")
                t.b(t.v(t.d("translate.market.add_to_wishlist.text", c, p, 0)))
                t.b("</p>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            "<h1>{{translate.market.add_to_wishlist.title}}</h1>\n<p>{{translate.market.add_to_wishlist.text}}</p>\n",
            H
          )
          return T
        })()

        /***/
      },

    /***/ "./src/templates/html/auto_buy_flavr_mall.html":
      /*!*****************************************************!*\
  !*** ./src/templates/html/auto_buy_flavr_mall.html ***!
  \*****************************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b("<h1>")
                t.b(t.v(t.d("translate.mall.add_to_wishlist.title", c, p, 0)))
                t.b("</h1>")
                t.b("\n" + i)
                t.b("<p>")
                t.b(t.v(t.d("translate.mall.add_to_wishlist.text", c, p, 0)))
                t.b("</p>")
                t.b("\n" + i)
                t.b('<p style="font-size: 14px"><em>')
                t.b(t.v(t.d("translate.mall.add_to_wishlist.note", c, p, 0)))
                t.b("</em></p>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            '<h1>{{translate.mall.add_to_wishlist.title}}</h1>\n<p>{{translate.mall.add_to_wishlist.text}}</p>\n<p style="font-size: 14px"><em>{{translate.mall.add_to_wishlist.note}}</em></p>\n',
            H
          )
          return T
        })()

        /***/
      },

    /***/ "./src/templates/html/auto_explore_button.html":
      /*!*****************************************************!*\
  !*** ./src/templates/html/auto_explore_button.html ***!
  \*****************************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b("<button")
                t.b("\n" + i)
                t.b('  id="auto-explore-button"')
                t.b("\n" + i)
                t.b('  class="nl-button ')
                if (t.s(t.f("active", c, p, 1), c, p, 0, 65, 71, "{{ }}")) {
                  t.rs(c, p, function (c, p, t) {
                    t.b("active")
                  })
                  c.pop()
                }
                t.b('"')
                t.b("\n" + i)
                t.b('  data-id="')
                t.b(t.v(t.f("locationId", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b('  data-mapid="')
                t.b(t.v(t.f("regionId", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b(">")
                t.b("\n" + i)
                t.b("  ")
                t.b(t.v(t.d("translate.pet.auto_explore", c, p, 0)))
                t.b("\n" + i)
                t.b("</button>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            '<button\n  id="auto-explore-button"\n  class="nl-button {{#active}}active{{/active}}"\n  data-id="{{locationId}}"\n  data-mapid="{{regionId}}"\n>\n  {{translate.pet.auto_explore}}\n</button>\n',
            H
          )
          return T
        })()

        /***/
      },

    /***/ "./src/templates/html/carousel_news.html":
      /*!***********************************************!*\
  !*** ./src/templates/html/carousel_news.html ***!
  \***********************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b("<a")
                t.b("\n" + i)
                t.b('  id="')
                t.b(t.v(t.f("id", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b('  class="carousel-news carousel-ee"')
                t.b("\n" + i)
                t.b('  href=""')
                t.b("\n" + i)
                t.b('  style="background-image: url(')
                t.b(t.v(t.f("backgroundImage", c, p, 0)))
                t.b(')"')
                t.b("\n" + i)
                t.b(">")
                t.b("\n" + i)
                t.b("  <div>")
                t.b("\n" + i)
                t.b("    <h4>")
                t.b(t.v(t.f("h4", c, p, 0)))
                t.b("</h4>")
                t.b("\n" + i)
                t.b("    <h5>")
                t.b(t.v(t.f("h5", c, p, 0)))
                t.b("</h5>")
                t.b("\n" + i)
                t.b("    <p>")
                t.b(t.v(t.f("p", c, p, 0)))
                t.b("</p>")
                t.b("\n" + i)
                t.b("  </div>")
                t.b("\n" + i)
                t.b("</a>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            '<a\n  id="{{id}}"\n  class="carousel-news carousel-ee"\n  href=""\n  style="background-image: url({{backgroundImage}})"\n>\n  <div>\n    <h4>{{h4}}</h4>\n    <h5>{{h5}}</h5>\n    <p>{{p}}</p>\n  </div>\n</a>\n',
            H
          )
          return T
        })()

        /***/
      },

    /***/ "./src/templates/html/change_price_flavr.html":
      /*!****************************************************!*\
  !*** ./src/templates/html/change_price_flavr.html ***!
  \****************************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b("<h1>")
                t.b(t.v(t.d("translate.market.change_price.title", c, p, 0)))
                t.b("</h1>")
                t.b("\n" + i)
                t.b("<p>")
                t.b(t.v(t.d("translate.market.change_price.text", c, p, 0)))
                t.b("</p>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            "<h1>{{translate.market.change_price.title}}</h1>\n<p>{{translate.market.change_price.text}}</p>\n",
            H
          )
          return T
        })()

        /***/
      },

    /***/ "./src/templates/html/created_outfit_flavr.html":
      /*!******************************************************!*\
  !*** ./src/templates/html/created_outfit_flavr.html ***!
  \******************************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b("<h1>")
                t.b(
                  t.v(
                    t.d(
                      "translate.appearance.favourites.save_outfit.title",
                      c,
                      p,
                      0
                    )
                  )
                )
                t.b("</h1>")
                t.b("\n")
                t.b("\n" + i)
                t.b("<p>")
                t.b(
                  t.t(
                    t.d(
                      "translate.appearance.favourites.save_outfit.saved_locally",
                      c,
                      p,
                      0
                    )
                  )
                )
                t.b("</p>")
                t.b("\n")
                t.b("\n" + i)
                t.b("<br />")
                t.b("\n")
                t.b("\n" + i)
                t.b("<p>")
                t.b(
                  t.t(
                    t.d(
                      "translate.appearance.favourites.save_outfit.goto_account",
                      c,
                      p,
                      0
                    )
                  )
                )
                t.b("</p>")
                t.b("\n")
                t.b("\n" + i)
                t.b("<input")
                t.b("\n" + i)
                t.b('  id="choose-name"')
                t.b("\n" + i)
                t.b('  maxlength="30"')
                t.b("\n" + i)
                t.b('  minlength="1"')
                t.b("\n" + i)
                t.b('  placeholder="')
                t.b(
                  t.v(
                    t.d(
                      "translate.appearance.favourites.save_outfit.placeholder",
                      c,
                      p,
                      0
                    )
                  )
                )
                t.b('"')
                t.b("\n" + i)
                t.b("/>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            '<h1>{{translate.appearance.favourites.save_outfit.title}}</h1>\n\n<p>{{{translate.appearance.favourites.save_outfit.saved_locally}}}</p>\n\n<br />\n\n<p>{{{translate.appearance.favourites.save_outfit.goto_account}}}</p>\n\n<input\n  id="choose-name"\n  maxlength="30"\n  minlength="1"\n  placeholder="{{translate.appearance.favourites.save_outfit.placeholder}}"\n/>\n',
            H
          )
          return T
        })()

        /***/
      },

    /***/ "./src/templates/html/exploration_history.html":
      /*!*****************************************************!*\
  !*** ./src/templates/html/exploration_history.html ***!
  \*****************************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b('<div id="history-container" style="width: 100%">')
                t.b("\n" + i)
                t.b("  <style>")
                t.b("\n" + i)
                t.b("    .history-actions {")
                t.b("\n" + i)
                t.b("      margin-bottom: 1em;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b("    #delete-history {")
                t.b("\n" + i)
                t.b("      margin-right: 1em;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b("    .help-icon {")
                t.b("\n" + i)
                t.b("      background-color: #0291f6;")
                t.b("\n" + i)
                t.b("      border-radius: 50%;")
                t.b("\n" + i)
                t.b("      box-shadow: none;")
                t.b("\n" + i)
                t.b("      color: #fff;")
                t.b("\n" + i)
                t.b("      font-size: 26px;")
                t.b("\n" + i)
                t.b("      font-weight: bold;")
                t.b("\n" + i)
                t.b("      height: 23px;")
                t.b("\n" + i)
                t.b("      line-height: 20px;")
                t.b("\n" + i)
                t.b("      padding: 0;")
                t.b("\n" + i)
                t.b("      text-align: center;")
                t.b("\n" + i)
                t.b("      width: 23px;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b("    .history-message {")
                t.b("\n" + i)
                t.b("      background-color: rgba(255, 255, 255, 0.7);")
                t.b("\n" + i)
                t.b("      border-radius: 1em;")
                t.b("\n" + i)
                t.b("      margin: 1em;")
                t.b("\n" + i)
                t.b("      padding: 1em;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b("    .history-row {")
                t.b("\n" + i)
                t.b("      display: flex;")
                t.b("\n" + i)
                t.b("      flex-wrap: wrap;")
                t.b("\n" + i)
                t.b("      height: 465px;")
                t.b("\n" + i)
                t.b("      margin-right: 1em;")
                t.b("\n" + i)
                t.b("      overflow-y: auto;")
                t.b("\n" + i)
                t.b("      scrollbar-color: dark;")
                t.b("\n" + i)
                t.b("      scrollbar-width: thin;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b("    .result-card {")
                t.b("\n" + i)
                t.b("      background-color: white;")
                t.b("\n" + i)
                t.b("      border-radius: 1em;")
                t.b("\n" + i)
                t.b("      box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.3);")
                t.b("\n" + i)
                t.b("      height: 205px;")
                t.b("\n" + i)
                t.b("      margin: 0.5em;")
                t.b("\n" + i)
                t.b("      padding: 0.5em;")
                t.b("\n" + i)
                t.b("      text-align: center;")
                t.b("\n" + i)
                t.b("      width: 128px;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b("    .result-image {")
                t.b("\n" + i)
                t.b("      background-color: white;")
                t.b("\n" + i)
                t.b("      border-radius: 1em;")
                t.b("\n" + i)
                t.b("      box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.12),")
                t.b("\n" + i)
                t.b("        0 2px 4px 2px rgba(0, 0, 0, 0.08);")
                t.b("\n" + i)
                t.b("      height: 100px;")
                t.b("\n" + i)
                t.b("      position: relative;")
                t.b("\n" + i)
                t.b("      top: -0.8em;")
                t.b("\n" + i)
                t.b("      width: 100px;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b("    .result-content-column {")
                t.b("\n" + i)
                t.b("      display: flex;")
                t.b("\n" + i)
                t.b("      flex-direction: column;")
                t.b("\n" + i)
                t.b("      height: 103px;")
                t.b("\n" + i)
                t.b("      justify-content: space-between;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b("    .result-name {")
                t.b("\n" + i)
                t.b("      -webkit-box-orient: vertical;")
                t.b("\n" + i)
                t.b("      -webkit-line-clamp: 3;")
                t.b("\n" + i)
                t.b("      color: rgb(52, 56, 111);")
                t.b("\n" + i)
                t.b("      display: -webkit-box;")
                t.b("\n" + i)
                t.b("      flex-grow: 1;")
                t.b("\n" + i)
                t.b("      font-size: 16px;")
                t.b("\n" + i)
                t.b("      font-weight: bold;")
                t.b("\n" + i)
                t.b("      margin-top: -0.2em;")
                t.b("\n" + i)
                t.b("      overflow: hidden;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b("    .result-location {")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b("    .result-date {")
                t.b("\n" + i)
                t.b("      color: #fb8900;")
                t.b("\n" + i)
                t.b("      font-size: 13px;")
                t.b("\n" + i)
                t.b("      font-weight: bold;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b("    .result-icons {")
                t.b("\n" + i)
                t.b("      margin-top: 0.5em;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b("    .result-count {")
                t.b("\n" + i)
                t.b("      background: #ffffff;")
                t.b("\n" + i)
                t.b("      border-radius: 100%;")
                t.b("\n" + i)
                t.b("      border: 1px solid #00cdfb;")
                t.b("\n" + i)
                t.b("      box-sizing: border-box;")
                t.b("\n" + i)
                t.b("      color: #3ec0d7;")
                t.b("\n" + i)
                t.b("      display: inline-block;")
                t.b("\n" + i)
                t.b('      font-family: "Alegreya Sans SC", sans-serif;')
                t.b("\n" + i)
                t.b("      font-size: 18px;")
                t.b("\n" + i)
                t.b("      font-weight: 800;")
                t.b("\n" + i)
                t.b("      height: 29px;")
                t.b("\n" + i)
                t.b("      line-height: 27px;")
                t.b("\n" + i)
                t.b("      text-align: center;")
                t.b("\n" + i)
                t.b("      user-select: none;")
                t.b("\n" + i)
                t.b("      width: 29px;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b("    .history-tradable {")
                t.b("\n" + i)
                t.b("      background-color: #666;")
                t.b("\n" + i)
                t.b("      border-radius: 25px;")
                t.b("\n" + i)
                t.b("      border: 1px solid #b9b9b9;")
                t.b("\n" + i)
                t.b("      color: #ffffff;")
                t.b("\n" + i)
                t.b("      display: inline-block;")
                t.b("\n" + i)
                t.b('      font-family: "Temp Menu", serif;')
                t.b("\n" + i)
                t.b("      font-size: 13px;")
                t.b("\n" + i)
                t.b("      height: 15px;")
                t.b("\n" + i)
                t.b("      line-height: 15px;")
                t.b("\n" + i)
                t.b("      text-align: center;")
                t.b("\n" + i)
                t.b("      width: 15px;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b("    .icon-spacer {")
                t.b("\n" + i)
                t.b("      display: inline-block;")
                t.b("\n" + i)
                t.b("      width: 0.1em;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n" + i)
                t.b("  </style>")
                t.b("\n")
                t.b("\n" + i)
                t.b('  <div class="history-actions">')
                t.b("\n" + i)
                t.b('    <button id="delete-history" class="nl-button">')
                t.b("\n" + i)
                t.b("      ")
                t.b(t.v(t.d("translate.pet.delete_history", c, p, 0)))
                t.b("\n" + i)
                t.b("    </button>")
                t.b("\n")
                t.b("\n" + i)
                t.b('    <span class="tooltip">')
                t.b("\n" + i)
                t.b('      <span class="nl-button help-icon">?</span>')
                t.b("\n" + i)
                t.b('      <div class="tooltip-content">')
                t.b("\n" + i)
                t.b("        <p>")
                t.b(t.t(t.d("translate.pet.saved_locally", c, p, 0)))
                t.b("</p>")
                t.b("\n" + i)
                t.b("        <p>")
                t.b(t.t(t.d("translate.pet.goto_account", c, p, 0)))
                t.b("</p>")
                t.b("\n" + i)
                t.b("      </div>")
                t.b("\n" + i)
                t.b("    </span>")
                t.b("\n" + i)
                t.b("  </div>")
                t.b("\n")
                t.b("\n" + i)
                if (!t.s(t.f("history", c, p, 1), c, p, 1, 0, 0, "")) {
                  t.b('  <p class="history-message">')
                  t.b(t.v(t.d("translate.pet.empty_history", c, p, 0)))
                  t.b("</p>")
                  t.b("\n" + i)
                }
                t.b("\n" + i)
                t.b('  <div class="history-row">')
                t.b("\n" + i)
                if (
                  t.s(t.f("history", c, p, 1), c, p, 0, 3230, 3863, "{{ }}")
                ) {
                  t.rs(c, p, function (c, p, t) {
                    t.b('    <div class="result-card">')
                    t.b("\n" + i)
                    t.b('      <img class="result-image" src="')
                    t.b(t.v(t.f("icon", c, p, 0)))
                    t.b('" />')
                    t.b("\n")
                    t.b("\n" + i)
                    t.b('      <div class="result-content-column">')
                    t.b("\n" + i)
                    t.b('        <div class="result-name">')
                    t.b(t.v(t.f("name", c, p, 0)))
                    t.b("</div>")
                    t.b("\n" + i)
                    t.b('        <div class="result-location">')
                    t.b(t.v(t.f("locationName", c, p, 0)))
                    t.b("</div>")
                    t.b("\n" + i)
                    t.b('        <div class="result-date">')
                    t.b(t.v(t.f("date", c, p, 0)))
                    t.b("</div>")
                    t.b("\n")
                    t.b("\n" + i)
                    t.b('        <div class="result-icons">')
                    t.b("\n" + i)
                    t.b("          ")
                    if (
                      t.s(t.f("count", c, p, 1), c, p, 0, 3566, 3609, "{{ }}")
                    ) {
                      t.rs(c, p, function (c, p, t) {
                        t.b('<span class="result-count">')
                        t.b(t.v(t.f("count", c, p, 0)))
                        t.b("</span>")
                      })
                      c.pop()
                    }
                    t.b("\n" + i)
                    if (
                      t.s(t.f("count", c, p, 1), c, p, 0, 3640, 3719, "{{ }}")
                    ) {
                      t.rs(c, p, function (c, p, t) {
                        if (
                          t.s(
                            t.f("tradable", c, p, 1),
                            c,
                            p,
                            0,
                            3653,
                            3706,
                            "{{ }}"
                          )
                        ) {
                          t.rs(c, p, function (c, p, t) {
                            t.b('          <div class="icon-spacer"></div>')
                            t.b("\n" + i)
                            t.b("          ")
                          })
                          c.pop()
                        }
                      })
                      c.pop()
                    }
                    t.b(" ")
                    if (
                      t.s(
                        t.f("tradable", c, p, 1),
                        c,
                        p,
                        0,
                        3743,
                        3806,
                        "{{ }}"
                      )
                    ) {
                      t.rs(c, p, function (c, p, t) {
                        t.b('<span class="history-tradable"')
                        t.b("\n" + i)
                        t.b("            ></span")
                        t.b("\n" + i)
                        t.b("          >")
                      })
                      c.pop()
                    }
                    t.b("\n" + i)
                    t.b("        </div>")
                    t.b("\n" + i)
                    t.b("      </div>")
                    t.b("\n" + i)
                    t.b("    </div>")
                    t.b("\n" + i)
                  })
                  c.pop()
                }
                t.b("  </div>")
                t.b("\n" + i)
                t.b("</div>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            '<div id="history-container" style="width: 100%">\n  <style>\n    .history-actions {\n      margin-bottom: 1em;\n    }\n\n    #delete-history {\n      margin-right: 1em;\n    }\n\n    .help-icon {\n      background-color: #0291f6;\n      border-radius: 50%;\n      box-shadow: none;\n      color: #fff;\n      font-size: 26px;\n      font-weight: bold;\n      height: 23px;\n      line-height: 20px;\n      padding: 0;\n      text-align: center;\n      width: 23px;\n    }\n\n    .history-message {\n      background-color: rgba(255, 255, 255, 0.7);\n      border-radius: 1em;\n      margin: 1em;\n      padding: 1em;\n    }\n\n    .history-row {\n      display: flex;\n      flex-wrap: wrap;\n      height: 465px;\n      margin-right: 1em;\n      overflow-y: auto;\n      scrollbar-color: dark;\n      scrollbar-width: thin;\n    }\n\n    .result-card {\n      background-color: white;\n      border-radius: 1em;\n      box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.3);\n      height: 205px;\n      margin: 0.5em;\n      padding: 0.5em;\n      text-align: center;\n      width: 128px;\n    }\n\n    .result-image {\n      background-color: white;\n      border-radius: 1em;\n      box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.12),\n        0 2px 4px 2px rgba(0, 0, 0, 0.08);\n      height: 100px;\n      position: relative;\n      top: -0.8em;\n      width: 100px;\n    }\n\n    .result-content-column {\n      display: flex;\n      flex-direction: column;\n      height: 103px;\n      justify-content: space-between;\n    }\n\n    .result-name {\n      -webkit-box-orient: vertical;\n      -webkit-line-clamp: 3;\n      color: rgb(52, 56, 111);\n      display: -webkit-box;\n      flex-grow: 1;\n      font-size: 16px;\n      font-weight: bold;\n      margin-top: -0.2em;\n      overflow: hidden;\n    }\n\n    .result-location {\n    }\n\n    .result-date {\n      color: #fb8900;\n      font-size: 13px;\n      font-weight: bold;\n    }\n\n    .result-icons {\n      margin-top: 0.5em;\n    }\n\n    .result-count {\n      background: #ffffff;\n      border-radius: 100%;\n      border: 1px solid #00cdfb;\n      box-sizing: border-box;\n      color: #3ec0d7;\n      display: inline-block;\n      font-family: "Alegreya Sans SC", sans-serif;\n      font-size: 18px;\n      font-weight: 800;\n      height: 29px;\n      line-height: 27px;\n      text-align: center;\n      user-select: none;\n      width: 29px;\n    }\n\n    .history-tradable {\n      background-color: #666;\n      border-radius: 25px;\n      border: 1px solid #b9b9b9;\n      color: #ffffff;\n      display: inline-block;\n      font-family: "Temp Menu", serif;\n      font-size: 13px;\n      height: 15px;\n      line-height: 15px;\n      text-align: center;\n      width: 15px;\n    }\n\n    .icon-spacer {\n      display: inline-block;\n      width: 0.1em;\n    }\n  </style>\n\n  <div class="history-actions">\n    <button id="delete-history" class="nl-button">\n      {{translate.pet.delete_history}}\n    </button>\n\n    <span class="tooltip">\n      <span class="nl-button help-icon">?</span>\n      <div class="tooltip-content">\n        <p>{{{translate.pet.saved_locally}}}</p>\n        <p>{{{translate.pet.goto_account}}}</p>\n      </div>\n    </span>\n  </div>\n\n  {{^history}}\n  <p class="history-message">{{translate.pet.empty_history}}</p>\n  {{/history}}\n\n  <div class="history-row">\n    {{#history}}\n    <div class="result-card">\n      <img class="result-image" src="{{icon}}" />\n\n      <div class="result-content-column">\n        <div class="result-name">{{name}}</div>\n        <div class="result-location">{{locationName}}</div>\n        <div class="result-date">{{date}}</div>\n\n        <div class="result-icons">\n          {{#count}}<span class="result-count">{{count}}</span>{{/count}}\n          {{#count}}{{#tradable}}\n          <div class="icon-spacer"></div>\n          {{/tradable}}{{/count}} {{#tradable}}<span class="history-tradable"\n            ></span\n          >{{/tradable}}\n        </div>\n      </div>\n    </div>\n    {{/history}}\n  </div>\n</div>\n',
            H
          )
          return T
        })()

        /***/
      },

    /***/ "./src/templates/html/favourite_outfit_flavr.html":
      /*!********************************************************!*\
  !*** ./src/templates/html/favourite_outfit_flavr.html ***!
  \********************************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b("<style>")
                t.b("\n" + i)
                t.b(
                  "  .created-outfit-popup .flavr-outer .flavr-message::after {"
                )
                t.b("\n" + i)
                t.b("    background-image: url(")
                t.b(t.v(t.f("url", c, p, 0)))
                t.b(");")
                t.b("\n" + i)
                t.b("    background-size: contain;")
                t.b("\n" + i)
                t.b("  }")
                t.b("\n" + i)
                t.b("</style>")
                t.b("\n")
                t.b("\n" + i)
                t.b("<h1>")
                t.b(t.v(t.f("name", c, p, 0)))
                t.b("</h1>")
                t.b("\n")
                t.b("\n" + i)
                t.b("<p>")
                t.b(
                  t.t(
                    t.d(
                      "translate.appearance.favourites.click_outfit.saved_locally",
                      c,
                      p,
                      0
                    )
                  )
                )
                t.b("</p>")
                t.b("\n")
                t.b("\n" + i)
                t.b("<br />")
                t.b("\n")
                t.b("\n" + i)
                t.b("<p>")
                t.b(
                  t.t(
                    t.d(
                      "translate.appearance.favourites.click_outfit.goto_account",
                      c,
                      p,
                      0
                    )
                  )
                )
                t.b("</p>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            "<style>\n  .created-outfit-popup .flavr-outer .flavr-message::after {\n    background-image: url({{url}});\n    background-size: contain;\n  }\n</style>\n\n<h1>{{name}}</h1>\n\n<p>{{{translate.appearance.favourites.click_outfit.saved_locally}}}</p>\n\n<br />\n\n<p>{{{translate.appearance.favourites.click_outfit.goto_account}}}</p>\n",
            H
          )
          return T
        })()

        /***/
      },

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

        /***/
      },

    /***/ "./src/templates/html/flavr_notif/icon_message.html":
      /*!**********************************************************!*\
  !*** ./src/templates/html/flavr_notif/icon_message.html ***!
  \**********************************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b("<img")
                t.b("\n" + i)
                t.b('  src="')
                t.b(t.v(t.f("icon", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b('  alt="')
                t.b(t.v(t.f("name", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b('  height="21"')
                t.b("\n" + i)
                t.b('  style="display: inline-block; margin: -2px auto"')
                t.b("\n" + i)
                t.b("/>")
                t.b("\n" + i)
                t.b(t.t(t.f("message", c, p, 0)))
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            '<img\n  src="{{icon}}"\n  alt="{{name}}"\n  height="21"\n  style="display: inline-block; margin: -2px auto"\n/>\n{{{message}}}\n',
            H
          )
          return T
        })()

        /***/
      },

    /***/ "./src/templates/html/header_takeover.html":
      /*!*************************************************!*\
  !*** ./src/templates/html/header_takeover.html ***!
  \*************************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b("<li")
                t.b("\n" + i)
                t.b('  id="header-takeover"')
                t.b("\n" + i)
                t.b('  title="')
                t.b(t.v(t.d("translate.home.takeover", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b(
                  '  style="transition: transform ease-in-out 200ms; cursor: pointer"'
                )
                t.b("\n" + i)
                t.b("  onMouseOver=\"this.style.transform='scale(1.3)'\"")
                t.b("\n" + i)
                t.b("  onMouseOut=\"this.style.transform='scale(1)'\"")
                t.b("\n" + i)
                t.b(">")
                t.b("\n" + i)
                t.b("  <a>")
                t.b("\n" + i)
                t.b("    <img")
                t.b("\n" + i)
                t.b(
                  '      src="/static/img/new-layout/home/connected/lock.png"'
                )
                t.b("\n" + i)
                t.b('      alt="')
                t.b(t.v(t.d("translate.home.takeover", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b('      style="filter: contrast(0%) brightness(200%) ')
                if (!t.s(t.f("takeover", c, p, 1), c, p, 1, 0, 0, "")) {
                  t.b("opacity(0)")
                }
                t.b('"')
                t.b("\n" + i)
                t.b('      height="21"')
                t.b("\n" + i)
                t.b("    />")
                t.b("\n" + i)
                t.b("  </a>")
                t.b("\n" + i)
                t.b("</li>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            '<li\n  id="header-takeover"\n  title="{{translate.home.takeover}}"\n  style="transition: transform ease-in-out 200ms; cursor: pointer"\n  onMouseOver="this.style.transform=\'scale(1.3)\'"\n  onMouseOut="this.style.transform=\'scale(1)\'"\n>\n  <a>\n    <img\n      src="/static/img/new-layout/home/connected/lock.png"\n      alt="{{translate.home.takeover}}"\n      style="filter: contrast(0%) brightness(200%) {{^takeover}}opacity(0){{/takeover}}"\n      height="21"\n    />\n  </a>\n</li>\n',
            H
          )
          return T
        })()

        /***/
      },

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

        /***/
      },

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

        /***/
      },

    /***/ "./src/templates/html/main_menu_purroshop.html":
      /*!*****************************************************!*\
  !*** ./src/templates/html/main_menu_purroshop.html ***!
  \*****************************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b('<li class="main-menu-purroshop">')
                t.b("\n" + i)
                t.b('  <a href="/mall/purroshop">')
                t.b("\n" + i)
                t.b("    <img")
                t.b("\n" + i)
                t.b('      height="20"')
                t.b("\n" + i)
                t.b(
                  '      src="/assets/img/item/consumable/b647d54afd6b04353e129219810512f5.png"'
                )
                t.b("\n" + i)
                t.b('      style="vertical-align: middle"')
                t.b("\n" + i)
                t.b("    />")
                t.b("\n" + i)
                t.b("    Purro'Shop")
                t.b("\n" + i)
                t.b("  </a>")
                t.b("\n" + i)
                t.b("</li>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            '<li class="main-menu-purroshop">\n  <a href="/mall/purroshop">\n    <img\n      height="20"\n      src="/assets/img/item/consumable/b647d54afd6b04353e129219810512f5.png"\n      style="vertical-align: middle"\n    />\n    Purro\'Shop\n  </a>\n</li>\n',
            H
          )
          return T
        })()

        /***/
      },

    /***/ "./src/templates/html/market_history.html":
      /*!************************************************!*\
  !*** ./src/templates/html/market_history.html ***!
  \************************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b("<style>")
                t.b("\n" + i)
                t.b(
                  "  /* #marketplace-abstract-purchases and #marketplace-abstract-sales were"
                )
                t.b("\n" + i)
                t.b(
                  "  re-written to target #purchase-history and #sale-history. */"
                )
                t.b("\n")
                t.b("\n" + i)
                t.b("  #purchase-history,")
                t.b("\n" + i)
                t.b("  #sale-history {")
                t.b("\n" + i)
                t.b("    height: 600px;")
                t.b("\n" + i)
                t.b("    position: relative;")
                t.b("\n" + i)
                t.b("    width: 360px;")
                t.b("\n" + i)
                t.b("    display: inline-block;")
                t.b("\n" + i)
                t.b("    vertical-align: top;")
                t.b("\n" + i)
                t.b("  }")
                t.b("\n")
                t.b("\n" + i)
                t.b("  #sale-history .abstract-actions,")
                t.b("\n" + i)
                t.b("  #purchase-history .abstract-actions {")
                t.b("\n" + i)
                t.b("    position: relative;")
                t.b("\n" + i)
                t.b("    top: -40px;")
                t.b("\n" + i)
                t.b("    display: flex;")
                t.b("\n" + i)
                t.b("    flex-direction: column;")
                t.b("\n" + i)
                t.b("    justify-content: space-evenly;")
                t.b("\n" + i)
                t.b("    height: 80px;")
                t.b("\n" + i)
                t.b("  }")
                t.b("\n")
                t.b("\n" + i)
                t.b("  #sale-history .abstract-time,")
                t.b("\n" + i)
                t.b("  #purchase-history .abstract-time {")
                t.b("\n" + i)
                t.b("    position: static;")
                t.b("\n" + i)
                t.b("    display: inline;")
                t.b("\n" + i)
                t.b("    height: auto;")
                t.b("\n" + i)
                t.b("    color: #fb8900;")
                t.b("\n" + i)
                t.b("    font-weight: bold;")
                t.b("\n" + i)
                t.b("    font-size: 13px;")
                t.b("\n" + i)
                t.b("  }")
                t.b("\n")
                t.b("\n" + i)
                t.b("  #purchase-history {")
                t.b("\n" + i)
                t.b("    margin-right: 80px;")
                t.b("\n" + i)
                t.b("  }")
                t.b("\n")
                t.b("\n" + i)
                t.b("  #purchase-history:before {")
                t.b("\n" + i)
                t.b('    content: "";')
                t.b("\n" + i)
                t.b("    position: absolute;")
                t.b("\n" + i)
                t.b("    top: 120px;")
                t.b("\n" + i)
                t.b("    right: -42px;")
                t.b("\n" + i)
                t.b("    border-right: solid 2px #aaa;")
                t.b("\n" + i)
                t.b("    height: 320px;")
                t.b("\n" + i)
                t.b("  }")
                t.b("\n")
                t.b("\n" + i)
                t.b("  /* Custom fixes to the layout */")
                t.b("\n")
                t.b("\n" + i)
                t.b("  #purchase-history li {")
                t.b("\n" + i)
                t.b("    margin-left: 4px;")
                t.b("\n" + i)
                t.b("    margin-right: 4px;")
                t.b("\n" + i)
                t.b("  }")
                t.b("\n" + i)
                t.b("</style>")
                t.b("\n")
                t.b("\n" + i)
                t.b("<!-- Purchases -->")
                t.b("\n" + i)
                t.b('<div class="marketplace-abstract" id="purchase-history">')
                t.b("\n" + i)
                t.b('  <h2 class="section-subtitle">')
                t.b("\n" + i)
                t.b("    ")
                t.b(
                  t.v(
                    t.d("translate.market.auctions.purchase_history", c, p, 0)
                  )
                )
                t.b("\n" + i)
                t.b("  </h2>")
                t.b("\n")
                t.b("\n" + i)
                t.b('  <ul class="marketplace-purchases-items">')
                t.b("\n" + i)
                if (
                  t.s(t.f("purchases", c, p, 1), c, p, 0, 1284, 2545, "{{ }}")
                ) {
                  t.rs(c, p, function (c, p, t) {
                    t.b("    <li")
                    t.b("\n" + i)
                    t.b('      data-itemid="')
                    t.b(t.v(t.f("itemid", c, p, 0)))
                    t.b('"')
                    t.b("\n" + i)
                    t.b(
                      '      class="marketplace-abstract marketplace-auctions-item marketplace-sales-item"'
                    )
                    t.b("\n" + i)
                    t.b("    >")
                    t.b("\n" + i)
                    t.b("      <!-- Icon -->")
                    t.b("\n" + i)
                    t.b('      <div class="abstract-icon">')
                    t.b("\n" + i)
                    t.b('        <img src="')
                    t.b(t.v(t.f("icon", c, p, 0)))
                    t.b('" />')
                    t.b("\n" + i)
                    t.b("      </div>")
                    t.b("\n")
                    t.b("\n" + i)
                    t.b("      <!-- Prices -->")
                    t.b("\n" + i)
                    t.b('      <div class="abstract-container">')
                    t.b("\n" + i)
                    t.b('        <div class="abstract-name">')
                    t.b(t.v(t.f("name", c, p, 0)))
                    t.b("</div>")
                    t.b("\n" + i)
                    t.b('        <div class="abstract-content">')
                    t.b("\n" + i)
                    t.b('          <div class="abstract-currentPrice">')
                    t.b("\n" + i)
                    t.b("            ")
                    if (
                      t.s(
                        t.f("currentPrice", c, p, 1),
                        c,
                        p,
                        0,
                        1738,
                        1907,
                        "{{ }}"
                      )
                    ) {
                      t.rs(c, p, function (c, p, t) {
                        t.b(" ")
                        t.b(
                          t.v(
                            t.d(
                              "translate.market.auctions.current_price",
                              c,
                              p,
                              0
                            )
                          )
                        )
                        t.b("\n" + i)
                        t.b('            <span class="price-item">')
                        t.b(t.v(t.d("currentPrice.price", c, p, 0)))
                        t.b("</span>")
                        t.b("\n" + i)
                        t.b('            <span class="maana-icon"></span>')
                        t.b("\n" + i)
                      })
                      c.pop()
                    }
                    t.b("            <br />")
                    t.b("\n" + i)
                    t.b("            ")
                    if (
                      t.s(
                        t.f("buyNowPrice", c, p, 1),
                        c,
                        p,
                        0,
                        1972,
                        2140,
                        "{{ }}"
                      )
                    ) {
                      t.rs(c, p, function (c, p, t) {
                        t.b(" ")
                        t.b(
                          t.v(
                            t.d(
                              "translate.market.auctions.buy_now_price",
                              c,
                              p,
                              0
                            )
                          )
                        )
                        t.b("\n" + i)
                        t.b('            <span class="price-item">')
                        t.b(t.v(t.d("buyNowPrice.price", c, p, 0)))
                        t.b("</span>")
                        t.b("\n" + i)
                        t.b('            <span class="maana-icon"></span>')
                        t.b("\n" + i)
                      })
                      c.pop()
                    }
                    t.b("          </div>")
                    t.b("\n" + i)
                    t.b("        </div>")
                    t.b("\n" + i)
                    t.b("      </div>")
                    t.b("\n")
                    t.b("\n" + i)
                    t.b("      <!-- Actions -->")
                    t.b("\n" + i)
                    t.b('      <div class="abstract-actions">')
                    t.b("\n" + i)
                    t.b('        <div class="abstract-time">')
                    t.b(t.v(t.f("date", c, p, 0)))
                    t.b("</div>")
                    t.b("\n" + i)
                    t.b("        <div")
                    t.b("\n" + i)
                    t.b(
                      '          class="nl-button nl-button-sm marketplace-itemDetail-cancel delete-button"'
                    )
                    t.b("\n" + i)
                    t.b('          data-itemid="')
                    t.b(t.v(t.f("itemid", c, p, 0)))
                    t.b('"')
                    t.b("\n" + i)
                    t.b("        >")
                    t.b("\n" + i)
                    t.b("          ")
                    t.b(t.v(t.d("translate.market.auctions.delete", c, p, 0)))
                    t.b("\n" + i)
                    t.b("        </div>")
                    t.b("\n" + i)
                    t.b("      </div>")
                    t.b("\n" + i)
                    t.b("    </li>")
                    t.b("\n" + i)
                  })
                  c.pop()
                }
                t.b("  </ul>")
                t.b("\n" + i)
                t.b("</div>")
                t.b("\n")
                t.b("\n" + i)
                t.b("<!-- Sales -->")
                t.b("\n" + i)
                t.b('<div class="marketplace-abstract" id="sale-history">')
                t.b("\n" + i)
                t.b('  <h2 class="section-subtitle">')
                t.b(
                  t.v(t.d("translate.market.auctions.sales_history", c, p, 0))
                )
                t.b("</h2>")
                t.b("\n")
                t.b("\n" + i)
                t.b('  <ul class="marketplace-sales-items">')
                t.b("\n" + i)
                if (t.s(t.f("sales", c, p, 1), c, p, 0, 2778, 3924, "{{ }}")) {
                  t.rs(c, p, function (c, p, t) {
                    t.b(
                      '    <li class="marketplace-abstract marketplace-sales-item">'
                    )
                    t.b("\n" + i)
                    t.b("      <!-- Icon -->")
                    t.b("\n" + i)
                    t.b('      <div class="abstract-icon">')
                    t.b("\n" + i)
                    t.b('        <img src="')
                    t.b(t.v(t.f("icon", c, p, 0)))
                    t.b('" />')
                    t.b("\n" + i)
                    t.b("      </div>")
                    t.b("\n")
                    t.b("\n" + i)
                    t.b("      <!-- Prices -->")
                    t.b("\n" + i)
                    t.b('      <div class="abstract-container">')
                    t.b("\n" + i)
                    t.b('        <div class="abstract-name">')
                    t.b(t.v(t.f("name", c, p, 0)))
                    t.b("</div>")
                    t.b("\n" + i)
                    t.b('        <div class="abstract-content">')
                    t.b("\n" + i)
                    t.b('          <div class="abstract-currentPrice">')
                    t.b("\n" + i)
                    t.b("            ")
                    if (
                      t.s(
                        t.f("currentPrice", c, p, 1),
                        c,
                        p,
                        0,
                        3164,
                        3327,
                        "{{ }}"
                      )
                    ) {
                      t.rs(c, p, function (c, p, t) {
                        t.b(" ")
                        t.b(
                          t.v(
                            t.d(
                              "translate.market.auctions.current_price",
                              c,
                              p,
                              0
                            )
                          )
                        )
                        t.b("\n" + i)
                        t.b('            <span class="price-item">')
                        t.b(t.v(t.f("currentPrice", c, p, 0)))
                        t.b("</span>")
                        t.b("\n" + i)
                        t.b('            <span class="maana-icon"></span>')
                        t.b("\n" + i)
                      })
                      c.pop()
                    }
                    t.b("            <br />")
                    t.b("\n" + i)
                    t.b("            ")
                    if (
                      t.s(
                        t.f("buyNowPrice", c, p, 1),
                        c,
                        p,
                        0,
                        3392,
                        3554,
                        "{{ }}"
                      )
                    ) {
                      t.rs(c, p, function (c, p, t) {
                        t.b(" ")
                        t.b(
                          t.v(
                            t.d(
                              "translate.market.auctions.buy_now_price",
                              c,
                              p,
                              0
                            )
                          )
                        )
                        t.b("\n" + i)
                        t.b('            <span class="price-item">')
                        t.b(t.v(t.f("buyNowPrice", c, p, 0)))
                        t.b("</span>")
                        t.b("\n" + i)
                        t.b('            <span class="maana-icon"></span>')
                        t.b("\n" + i)
                      })
                      c.pop()
                    }
                    t.b("          </div>")
                    t.b("\n" + i)
                    t.b("        </div>")
                    t.b("\n" + i)
                    t.b("      </div>")
                    t.b("\n")
                    t.b("\n" + i)
                    t.b("      <!-- Actions -->")
                    t.b("\n" + i)
                    t.b('      <div class="abstract-actions">')
                    t.b("\n" + i)
                    t.b('        <div class="abstract-time">')
                    t.b(t.v(t.f("date", c, p, 0)))
                    t.b("</div>")
                    t.b("\n" + i)
                    t.b("        <div")
                    t.b("\n" + i)
                    t.b(
                      '          class="nl-button nl-button-sm marketplace-itemDetail-cancel delete-button"'
                    )
                    t.b("\n" + i)
                    t.b("        >")
                    t.b("\n" + i)
                    t.b("          ")
                    t.b(t.v(t.d("translate.market.auctions.delete", c, p, 0)))
                    t.b("\n" + i)
                    t.b("        </div>")
                    t.b("\n" + i)
                    t.b("      </div>")
                    t.b("\n" + i)
                    t.b("    </li>")
                    t.b("\n" + i)
                  })
                  c.pop()
                }
                t.b("  </ul>")
                t.b("\n" + i)
                t.b("</div>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            '<style>\n  /* #marketplace-abstract-purchases and #marketplace-abstract-sales were\n  re-written to target #purchase-history and #sale-history. */\n\n  #purchase-history,\n  #sale-history {\n    height: 600px;\n    position: relative;\n    width: 360px;\n    display: inline-block;\n    vertical-align: top;\n  }\n\n  #sale-history .abstract-actions,\n  #purchase-history .abstract-actions {\n    position: relative;\n    top: -40px;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-evenly;\n    height: 80px;\n  }\n\n  #sale-history .abstract-time,\n  #purchase-history .abstract-time {\n    position: static;\n    display: inline;\n    height: auto;\n    color: #fb8900;\n    font-weight: bold;\n    font-size: 13px;\n  }\n\n  #purchase-history {\n    margin-right: 80px;\n  }\n\n  #purchase-history:before {\n    content: "";\n    position: absolute;\n    top: 120px;\n    right: -42px;\n    border-right: solid 2px #aaa;\n    height: 320px;\n  }\n\n  /* Custom fixes to the layout */\n\n  #purchase-history li {\n    margin-left: 4px;\n    margin-right: 4px;\n  }\n</style>\n\n<!-- Purchases -->\n<div class="marketplace-abstract" id="purchase-history">\n  <h2 class="section-subtitle">\n    {{translate.market.auctions.purchase_history}}\n  </h2>\n\n  <ul class="marketplace-purchases-items">\n    {{#purchases}}\n    <li\n      data-itemid="{{itemid}}"\n      class="marketplace-abstract marketplace-auctions-item marketplace-sales-item"\n    >\n      <!-- Icon -->\n      <div class="abstract-icon">\n        <img src="{{icon}}" />\n      </div>\n\n      <!-- Prices -->\n      <div class="abstract-container">\n        <div class="abstract-name">{{name}}</div>\n        <div class="abstract-content">\n          <div class="abstract-currentPrice">\n            {{#currentPrice}} {{translate.market.auctions.current_price}}\n            <span class="price-item">{{currentPrice.price}}</span>\n            <span class="maana-icon"></span>\n            {{/currentPrice}}\n            <br />\n            {{#buyNowPrice}} {{translate.market.auctions.buy_now_price}}\n            <span class="price-item">{{buyNowPrice.price}}</span>\n            <span class="maana-icon"></span>\n            {{/buyNowPrice}}\n          </div>\n        </div>\n      </div>\n\n      <!-- Actions -->\n      <div class="abstract-actions">\n        <div class="abstract-time">{{date}}</div>\n        <div\n          class="nl-button nl-button-sm marketplace-itemDetail-cancel delete-button"\n          data-itemid="{{itemid}}"\n        >\n          {{translate.market.auctions.delete}}\n        </div>\n      </div>\n    </li>\n    {{/purchases}}\n  </ul>\n</div>\n\n<!-- Sales -->\n<div class="marketplace-abstract" id="sale-history">\n  <h2 class="section-subtitle">{{translate.market.auctions.sales_history}}</h2>\n\n  <ul class="marketplace-sales-items">\n    {{#sales}}\n    <li class="marketplace-abstract marketplace-sales-item">\n      <!-- Icon -->\n      <div class="abstract-icon">\n        <img src="{{icon}}" />\n      </div>\n\n      <!-- Prices -->\n      <div class="abstract-container">\n        <div class="abstract-name">{{name}}</div>\n        <div class="abstract-content">\n          <div class="abstract-currentPrice">\n            {{#currentPrice}} {{translate.market.auctions.current_price}}\n            <span class="price-item">{{currentPrice}}</span>\n            <span class="maana-icon"></span>\n            {{/currentPrice}}\n            <br />\n            {{#buyNowPrice}} {{translate.market.auctions.buy_now_price}}\n            <span class="price-item">{{buyNowPrice}}</span>\n            <span class="maana-icon"></span>\n            {{/buyNowPrice}}\n          </div>\n        </div>\n      </div>\n\n      <!-- Actions -->\n      <div class="abstract-actions">\n        <div class="abstract-time">{{date}}</div>\n        <div\n          class="nl-button nl-button-sm marketplace-itemDetail-cancel delete-button"\n        >\n          {{translate.market.auctions.delete}}\n        </div>\n      </div>\n    </li>\n    {{/sales}}\n  </ul>\n</div>\n',
            H
          )
          return T
        })()

        /***/
      },

    /***/ "./src/templates/html/outfit_thumbs.html":
      /*!***********************************************!*\
  !*** ./src/templates/html/outfit_thumbs.html ***!
  \***********************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b('<div id="ee-outfit-thumbs">')
                t.b("\n" + i)
                t.b("  <style>")
                t.b("\n" + i)
                t.b(
                  "    #appearance-items-category-favorites .slot.ee-available-slot {"
                )
                t.b("\n" + i)
                t.b(
                  "      background-image: url(https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/available-favorite.png);"
                )
                t.b("\n" + i)
                t.b("      background-position: -14px -11px;")
                t.b("\n" + i)
                t.b("      background-size: 171px 244px;")
                t.b("\n" + i)
                t.b("      border-radius: 44px;")
                t.b("\n" + i)
                t.b("      box-shadow: 0 0 4px 4px rgba(255, 255, 255, 0.8);")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b(
                  "    #appearance-items-category-favorites .slot.ee-available-slot::after {"
                )
                t.b("\n" + i)
                t.b(
                  "      background: url(/static/img/new-layout/wardrobe/icon-plus.png);"
                )
                t.b("\n" + i)
                t.b('      content: " ";')
                t.b("\n" + i)
                t.b(
                  "      filter: drop-shadow(0 0 6px rgba(237, 12, 245, 0.9));"
                )
                t.b("\n" + i)
                t.b("      height: 71px;")
                t.b("\n" + i)
                t.b("      left: 50%;")
                t.b("\n" + i)
                t.b("      opacity: 0;")
                t.b("\n" + i)
                t.b("      position: absolute;")
                t.b("\n" + i)
                t.b("      top: 50%;")
                t.b("\n" + i)
                t.b("      transform: translate(-50%, -50%);")
                t.b("\n" + i)
                t.b("      transition: opacity ease-in-out 100ms;")
                t.b("\n" + i)
                t.b("      width: 66px;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b(
                  "    #appearance-items-category-favorites .slot.ee-available-slot:hover::after,"
                )
                t.b("\n" + i)
                t.b(
                  "    #appearance-items-category-favorites .slot.ee-outfit-thumb:hover p {"
                )
                t.b("\n" + i)
                t.b("      opacity: 1;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b(
                  "    #appearance-items-category-favorites .slot.ee-outfit-thumb img {"
                )
                t.b("\n" + i)
                t.b("      border-radius: 44px;")
                t.b("\n" + i)
                t.b("      height: 100%;")
                t.b("\n" + i)
                t.b("      width: 100%;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b(
                  "    #appearance-items-category-favorites .slot.ee-outfit-thumb p {"
                )
                t.b("\n" + i)
                t.b("      background: rgba(0, 0, 0, 0.5);")
                t.b("\n" + i)
                t.b("      color: #fff;")
                t.b("\n" + i)
                t.b('      font-family: "Alegreya Sans SC", sans-serif;')
                t.b("\n" + i)
                t.b("      font-size: 22px;")
                t.b("\n" + i)
                t.b("      font-weight: 700;")
                t.b("\n" + i)
                t.b("      left: 50%;")
                t.b("\n" + i)
                t.b("      line-height: 22px;")
                t.b("\n" + i)
                t.b("      opacity: 0;")
                t.b("\n" + i)
                t.b("      padding: 12px 0;")
                t.b("\n" + i)
                t.b("      position: absolute;")
                t.b("\n" + i)
                t.b("      text-align: center;")
                t.b("\n" + i)
                t.b("      top: 50%;")
                t.b("\n" + i)
                t.b("      transform: translate(-50%, -50%);")
                t.b("\n" + i)
                t.b("      transition: opacity ease-in-out 400ms;")
                t.b("\n" + i)
                t.b("      width: 100%;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n" + i)
                t.b("  </style>")
                t.b("\n")
                t.b("\n" + i)
                if (
                  t.s(t.f("outfits", c, p, 1), c, p, 0, 1654, 1790, "{{ }}")
                ) {
                  t.rs(c, p, function (c, p, t) {
                    t.b(
                      '  <div class="slot ee-outfit-thumb" data-array-index="'
                    )
                    t.b(t.v(t.f("id", c, p, 0)))
                    t.b('">')
                    t.b("\n" + i)
                    t.b('    <img alt="')
                    t.b(t.v(t.f("name", c, p, 0)))
                    t.b('" src="')
                    t.b(t.v(t.f("url", c, p, 0)))
                    t.b('" />')
                    t.b("\n" + i)
                    t.b("    <p>")
                    t.b(t.v(t.f("name", c, p, 0)))
                    t.b("</p>")
                    t.b("\n" + i)
                    t.b("  </div>")
                    t.b("\n" + i)
                  })
                  c.pop()
                }
                t.b("\n" + i)
                t.b('  <div class="slot ee-available-slot"></div>')
                t.b("\n" + i)
                t.b("</div>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            '<div id="ee-outfit-thumbs">\n  <style>\n    #appearance-items-category-favorites .slot.ee-available-slot {\n      background-image: url(https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/available-favorite.png);\n      background-position: -14px -11px;\n      background-size: 171px 244px;\n      border-radius: 44px;\n      box-shadow: 0 0 4px 4px rgba(255, 255, 255, 0.8);\n    }\n\n    #appearance-items-category-favorites .slot.ee-available-slot::after {\n      background: url(/static/img/new-layout/wardrobe/icon-plus.png);\n      content: " ";\n      filter: drop-shadow(0 0 6px rgba(237, 12, 245, 0.9));\n      height: 71px;\n      left: 50%;\n      opacity: 0;\n      position: absolute;\n      top: 50%;\n      transform: translate(-50%, -50%);\n      transition: opacity ease-in-out 100ms;\n      width: 66px;\n    }\n\n    #appearance-items-category-favorites .slot.ee-available-slot:hover::after,\n    #appearance-items-category-favorites .slot.ee-outfit-thumb:hover p {\n      opacity: 1;\n    }\n\n    #appearance-items-category-favorites .slot.ee-outfit-thumb img {\n      border-radius: 44px;\n      height: 100%;\n      width: 100%;\n    }\n\n    #appearance-items-category-favorites .slot.ee-outfit-thumb p {\n      background: rgba(0, 0, 0, 0.5);\n      color: #fff;\n      font-family: "Alegreya Sans SC", sans-serif;\n      font-size: 22px;\n      font-weight: 700;\n      left: 50%;\n      line-height: 22px;\n      opacity: 0;\n      padding: 12px 0;\n      position: absolute;\n      text-align: center;\n      top: 50%;\n      transform: translate(-50%, -50%);\n      transition: opacity ease-in-out 400ms;\n      width: 100%;\n    }\n  </style>\n\n  {{#outfits}}\n  <div class="slot ee-outfit-thumb" data-array-index="{{id}}">\n    <img alt="{{name}}" src="{{url}}" />\n    <p>{{name}}</p>\n  </div>\n  {{/outfits}}\n\n  <div class="slot ee-available-slot"></div>\n</div>\n',
            H
          )
          return T
        })()

        /***/
      },

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

        /***/
      },

    /***/ "./src/templates/html/settings.html":
      /*!******************************************!*\
  !*** ./src/templates/html/settings.html ***!
  \******************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b('<div class="account-misc-bloc account-ee-bloc bloc">')
                t.b("\n" + i)
                t.b("  <!--")
                t.b("\n" + i)
                t.b("  <style>")
                t.b("\n" + i)
                t.b("    table {")
                t.b("\n" + i)
                t.b("      width: 100%;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n")
                t.b("\n" + i)
                t.b("    th {")
                t.b("\n" + i)
                t.b("      text-align: start;")
                t.b("\n" + i)
                t.b("      padding: 1em;")
                t.b("\n" + i)
                t.b("    }")
                t.b("\n" + i)
                t.b("  </style>")
                t.b("\n" + i)
                t.b("  -->")
                t.b("\n")
                t.b("\n" + i)
                t.b("  <!-- Settings -->")
                t.b("\n" + i)
                t.b('  <h2 class="section-title">')
                t.b(t.v(t.d("translate.account.enhancements", c, p, 0)))
                t.b("</h2>")
                t.b("\n" + i)
                t.b('  <ul class="account-misc-actions">')
                t.b("\n" + i)
                t.b("    <li")
                t.b("\n" + i)
                t.b('      id="ee-debug-enabled"')
                t.b("\n" + i)
                t.b('      class="nl-button nl-button-sm ')
                if (t.s(t.f("debug", c, p, 1), c, p, 0, 392, 398, "{{ }}")) {
                  t.rs(c, p, function (c, p, t) {
                    t.b("active")
                  })
                  c.pop()
                }
                t.b('"')
                t.b("\n" + i)
                t.b('      title="')
                t.b(t.v(t.d("translate.account.debug_tooltip", c, p, 0)))
                t.b('"')
                t.b("\n" + i)
                t.b("    >")
                t.b("\n" + i)
                t.b("      ")
                t.b(t.v(t.d("translate.account.debug", c, p, 0)))
                t.b("\n" + i)
                t.b("    </li>")
                t.b("\n" + i)
                if (
                  t.s(t.f("unlocked", c, p, 1), c, p, 0, 527, 1030, "{{ }}")
                ) {
                  t.rs(c, p, function (c, p, t) {
                    t.b("    <li")
                    t.b("\n" + i)
                    t.b('      id="ee-minigames-enabled"')
                    t.b("\n" + i)
                    t.b('      class="nl-button nl-button-sm ')
                    if (
                      t.s(t.f("minigames", c, p, 1), c, p, 0, 618, 624, "{{ }}")
                    ) {
                      t.rs(c, p, function (c, p, t) {
                        t.b("active")
                      })
                      c.pop()
                    }
                    t.b('"')
                    t.b("\n" + i)
                    t.b("    >")
                    t.b("\n" + i)
                    t.b("      ")
                    t.b(t.v(t.d("translate.account.minigames", c, p, 0)))
                    t.b("\n" + i)
                    t.b("    </li>")
                    t.b("\n" + i)
                    t.b("    <li")
                    t.b("\n" + i)
                    t.b('      id="ee-explorations-enabled"')
                    t.b("\n" + i)
                    t.b('      class="nl-button nl-button-sm ')
                    if (
                      t.s(
                        t.f("explorations", c, p, 1),
                        c,
                        p,
                        0,
                        790,
                        796,
                        "{{ }}"
                      )
                    ) {
                      t.rs(c, p, function (c, p, t) {
                        t.b("active")
                      })
                      c.pop()
                    }
                    t.b('"')
                    t.b("\n" + i)
                    t.b("    >")
                    t.b("\n" + i)
                    t.b("      ")
                    t.b(t.v(t.d("translate.account.explorations", c, p, 0)))
                    t.b("\n" + i)
                    t.b("    </li>")
                    t.b("\n" + i)
                    t.b("    <li")
                    t.b("\n" + i)
                    t.b('      id="ee-market-enabled"')
                    t.b("\n" + i)
                    t.b('      class="nl-button nl-button-sm ')
                    if (
                      t.s(t.f("market", c, p, 1), c, p, 0, 956, 962, "{{ }}")
                    ) {
                      t.rs(c, p, function (c, p, t) {
                        t.b("active")
                      })
                      c.pop()
                    }
                    t.b('"')
                    t.b("\n" + i)
                    t.b("    >")
                    t.b("\n" + i)
                    t.b("      ")
                    t.b(t.v(t.d("translate.account.market", c, p, 0)))
                    t.b("\n" + i)
                    t.b("    </li>")
                    t.b("\n" + i)
                  })
                  c.pop()
                }
                t.b('    <li id="ee-import" class="nl-button nl-button-sm">')
                t.b("\n" + i)
                t.b("      ")
                t.b(t.v(t.d("translate.account.import", c, p, 0)))
                t.b("\n" + i)
                t.b("    </li>")
                t.b("\n" + i)
                t.b('    <li id="ee-export" class="nl-button nl-button-sm">')
                t.b("\n" + i)
                t.b("      ")
                t.b(t.v(t.d("translate.account.export", c, p, 0)))
                t.b("\n" + i)
                t.b("    </li>")
                t.b("\n" + i)
                t.b("  </ul>")
                t.b("\n")
                t.b("\n" + i)
                t.b("  <!-- Explorations")
                t.b("\n" + i)
                t.b('  <h3 class="section-title">Explorations</h3>')
                t.b("\n" + i)
                t.b("  <table>")
                t.b("\n" + i)
                t.b("    <thead>")
                t.b("\n" + i)
                t.b("      <th>Location</th>")
                t.b("\n" + i)
                t.b("      <th>Delete</th>")
                t.b("\n" + i)
                t.b("    </thead>")
                t.b("\n" + i)
                t.b("    <tbody>")
                t.b("\n" + i)
                t.b("      <td>Rock</td>")
                t.b("\n" + i)
                t.b("      <td>")
                t.b("\n" + i)
                t.b('        <div class="nl-button nl-button-sm">Delete</div>')
                t.b("\n" + i)
                t.b("      </td>")
                t.b("\n" + i)
                t.b("    </tbody>")
                t.b("\n" + i)
                t.b("  </table>")
                t.b("\n" + i)
                t.b("  -->")
                t.b("\n" + i)
                t.b("</div>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            '<div class="account-misc-bloc account-ee-bloc bloc">\n  <!--\n  <style>\n    table {\n      width: 100%;\n    }\n\n    th {\n      text-align: start;\n      padding: 1em;\n    }\n  </style>\n  -->\n\n  <!-- Settings -->\n  <h2 class="section-title">{{translate.account.enhancements}}</h2>\n  <ul class="account-misc-actions">\n    <li\n      id="ee-debug-enabled"\n      class="nl-button nl-button-sm {{#debug}}active{{/debug}}"\n      title="{{translate.account.debug_tooltip}}"\n    >\n      {{translate.account.debug}}\n    </li>\n    {{#unlocked}}\n    <li\n      id="ee-minigames-enabled"\n      class="nl-button nl-button-sm {{#minigames}}active{{/minigames}}"\n    >\n      {{translate.account.minigames}}\n    </li>\n    <li\n      id="ee-explorations-enabled"\n      class="nl-button nl-button-sm {{#explorations}}active{{/explorations}}"\n    >\n      {{translate.account.explorations}}\n    </li>\n    <li\n      id="ee-market-enabled"\n      class="nl-button nl-button-sm {{#market}}active{{/market}}"\n    >\n      {{translate.account.market}}\n    </li>\n    {{/unlocked}}\n    <li id="ee-import" class="nl-button nl-button-sm">\n      {{translate.account.import}}\n    </li>\n    <li id="ee-export" class="nl-button nl-button-sm">\n      {{translate.account.export}}\n    </li>\n  </ul>\n\n  <!-- Explorations\n  <h3 class="section-title">Explorations</h3>\n  <table>\n    <thead>\n      <th>Location</th>\n      <th>Delete</th>\n    </thead>\n    <tbody>\n      <td>Rock</td>\n      <td>\n        <div class="nl-button nl-button-sm">Delete</div>\n      </td>\n    </tbody>\n  </table>\n  -->\n</div>\n',
            H
          )
          return T
        })()

        /***/
      },

    /***/ "./src/templates/html/wishlist_button.html":
      /*!*************************************************!*\
  !*** ./src/templates/html/wishlist_button.html ***!
  \*************************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b('<a id="wishlist-button" class="nl-button">')
                t.b("\n" + i)
                t.b("  ")
                t.b(t.v(t.d("translate.market.wishlist.title", c, p, 0)))
                t.b("\n" + i)
                t.b("</a>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            '<a id="wishlist-button" class="nl-button">\n  {{translate.market.wishlist.title}}\n</a>\n',
            H
          )
          return T
        })()

        /***/
      },

    /***/ "./src/templates/html/wishlist_settings.html":
      /*!***************************************************!*\
  !*** ./src/templates/html/wishlist_settings.html ***!
  \***************************************************/
      /***/ (module, __unused_webpack_exports, __webpack_require__) => {
        var H = __webpack_require__(
          /*! hogan.js */ "./node_modules/.pnpm/hogan.js@3.0.2/node_modules/hogan.js/lib/hogan.js"
        )
        module.exports = (function () {
          var T = new H.Template(
            {
              code: function (c, p, i) {
                var t = this
                t.b((i = i || ""))
                t.b("<style>")
                t.b("\n" + i)
                t.b("  table {")
                t.b("\n" + i)
                t.b("    text-align: center;")
                t.b("\n" + i)
                t.b("    width: 100%;")
                t.b("\n" + i)
                t.b("  }")
                t.b("\n")
                t.b("\n" + i)
                t.b("  .action-picto {")
                t.b("\n" + i)
                t.b("    height: 50px;")
                t.b("\n" + i)
                t.b("    width: 50px;")
                t.b("\n" + i)
                t.b("    cursor: pointer;")
                t.b("\n" + i)
                t.b("  }")
                t.b("\n")
                t.b("\n" + i)
                t.b("  .action-picto:hover:not(.disabled),")
                t.b("\n" + i)
                t.b("  .edit-price:hover {")
                t.b("\n" + i)
                t.b("    animation: button-bounce 300ms linear forwards;")
                t.b("\n" + i)
                t.b("    filter: brightness(1.05) contrast(1.1);")
                t.b("\n" + i)
                t.b("  }")
                t.b("\n")
                t.b("\n" + i)
                t.b("  .edit-price {")
                t.b("\n" + i)
                t.b("    cursor: pointer;")
                t.b("\n" + i)
                t.b("  }")
                t.b("\n")
                t.b("\n" + i)
                t.b("  img.disabled {")
                t.b("\n" + i)
                t.b("    filter: grayscale(1);")
                t.b("\n" + i)
                t.b("  }")
                t.b("\n")
                t.b("\n" + i)
                t.b("  .item-icon-container {")
                t.b("\n" + i)
                t.b("    display: inline-block;")
                t.b("\n" + i)
                t.b("    position: relative;")
                t.b("\n" + i)
                t.b("  }")
                t.b("\n")
                t.b("\n" + i)
                t.b("  .item-icon {")
                t.b("\n" + i)
                t.b("    width: 100px;")
                t.b("\n" + i)
                t.b("    height: 100px;")
                t.b("\n" + i)
                t.b("  }")
                t.b("\n" + i)
                t.b("</style>")
                t.b("\n")
                t.b("\n" + i)
                t.b("<table>")
                t.b("\n" + i)
                t.b("  <thead>")
                t.b("\n" + i)
                t.b("    <tr>")
                t.b("\n" + i)
                t.b("      <th>")
                t.b(t.v(t.d("translate.market.wishlist.icon", c, p, 0)))
                t.b("</th>")
                t.b("\n" + i)
                t.b("      <th>")
                t.b(t.v(t.d("translate.market.wishlist.name", c, p, 0)))
                t.b("</th>")
                t.b("\n" + i)
                t.b("      <th>")
                t.b(t.v(t.d("translate.market.wishlist.price", c, p, 0)))
                t.b("</th>")
                t.b("\n" + i)
                t.b("      <th>")
                t.b(t.v(t.d("translate.market.wishlist.status", c, p, 0)))
                t.b("</th>")
                t.b("\n" + i)
                t.b("      <th>")
                t.b(t.v(t.d("translate.market.wishlist.actions", c, p, 0)))
                t.b("</th>")
                t.b("\n" + i)
                t.b("    </tr>")
                t.b("\n" + i)
                t.b("  </thead>")
                t.b("\n" + i)
                t.b("  <tbody>")
                t.b("\n" + i)
                if (
                  t.s(t.f("wishlist", c, p, 1), c, p, 0, 872, 2260, "{{ }}")
                ) {
                  t.rs(c, p, function (c, p, t) {
                    t.b('    <tr class="marketplace-abstract" data-icon="')
                    t.b(t.v(t.f("icon", c, p, 0)))
                    t.b('">')
                    t.b("\n" + i)
                    t.b("      <!-- Icon -->")
                    t.b("\n" + i)
                    t.b("      <td>")
                    t.b("\n" + i)
                    t.b('        <div class="item-icon-container">')
                    t.b("\n" + i)
                    t.b('          <img class="item-icon" src="')
                    t.b(t.v(t.f("icon", c, p, 0)))
                    t.b('" alt="')
                    t.b(t.v(t.f("name", c, p, 0)))
                    t.b('" />')
                    t.b("\n" + i)
                    t.b('          <div class="rarity-marker-')
                    t.b(t.v(t.f("rarity", c, p, 0)))
                    t.b('"></div>')
                    t.b("\n" + i)
                    t.b("        </div>")
                    t.b("\n" + i)
                    t.b("      </td>")
                    t.b("\n")
                    t.b("\n" + i)
                    t.b("      <!-- Name -->")
                    t.b("\n" + i)
                    t.b("      <td>")
                    t.b("\n" + i)
                    t.b('        <div class="abstract-name">')
                    t.b(t.v(t.f("name", c, p, 0)))
                    t.b("</div>")
                    t.b("\n" + i)
                    t.b('        <div class="abstract-type">')
                    t.b(t.v(t.f("abstractType", c, p, 0)))
                    t.b("</div>")
                    t.b("\n" + i)
                    t.b("      </td>")
                    t.b("\n")
                    t.b("\n" + i)
                    t.b("      <!-- Price -->")
                    t.b("\n" + i)
                    t.b("      <td>")
                    t.b("\n" + i)
                    t.b("        <div")
                    t.b("\n" + i)
                    t.b('          class="edit-price"')
                    t.b("\n" + i)
                    t.b('          title="')
                    t.b(
                      t.v(
                        t.d("translate.market.wishlist.change_price", c, p, 0)
                      )
                    )
                    t.b('"')
                    t.b("\n" + i)
                    t.b("        >")
                    t.b("\n" + i)
                    t.b('          <span class="price-item">')
                    t.b(t.v(t.f("price", c, p, 0)))
                    t.b("</span>")
                    t.b("\n" + i)
                    t.b(
                      '          <span class="maana-icon" alt="maanas"></span>'
                    )
                    t.b("\n" + i)
                    t.b("        </div>")
                    t.b("\n" + i)
                    t.b("      </td>")
                    t.b("\n")
                    t.b("\n" + i)
                    t.b("      <!-- Error -->")
                    t.b("\n" + i)
                    t.b("      <td>")
                    t.b("\n" + i)
                    t.b('        <p class="error">')
                    t.b(t.v(t.f("error", c, p, 0)))
                    t.b("</p>")
                    t.b("\n" + i)
                    t.b("      </td>")
                    t.b("\n")
                    t.b("\n" + i)
                    t.b("      <!-- Actions -->")
                    t.b("\n" + i)
                    t.b("      <td>")
                    t.b("\n" + i)
                    t.b("        <img")
                    t.b("\n" + i)
                    t.b('          class="action-picto reset-item-status ')
                    if (!t.s(t.f("error", c, p, 1), c, p, 1, 0, 0, "")) {
                      t.b("disabled")
                    }
                    t.b('"')
                    t.b("\n" + i)
                    t.b(
                      '          src="/static/img/new-layout/wardrobe/reset-btn.png"'
                    )
                    t.b("\n" + i)
                    t.b('          title="')
                    t.b(
                      t.v(
                        t.d("translate.market.wishlist.reset_tooltip", c, p, 0)
                      )
                    )
                    t.b('"')
                    t.b("\n" + i)
                    t.b('          alt="')
                    t.b(t.v(t.d("translate.market.wishlist.reset", c, p, 0)))
                    t.b('"')
                    t.b("\n" + i)
                    t.b("        />")
                    t.b("\n" + i)
                    t.b("        <img")
                    t.b("\n" + i)
                    t.b('          class="action-picto delete-wishlist-item"')
                    t.b("\n" + i)
                    t.b(
                      '          src="/static/img/new-layout/wardrobe/delete.png"'
                    )
                    t.b("\n" + i)
                    t.b('          title="')
                    t.b(
                      t.v(
                        t.d("translate.market.wishlist.delete_tooltip", c, p, 0)
                      )
                    )
                    t.b('"')
                    t.b("\n" + i)
                    t.b('          alt="')
                    t.b(t.v(t.d("translate.market.wishlist.delete", c, p, 0)))
                    t.b('"')
                    t.b("\n" + i)
                    t.b("        />")
                    t.b("\n" + i)
                    t.b("      </td>")
                    t.b("\n" + i)
                    t.b("    </tr>")
                    t.b("\n" + i)
                  })
                  c.pop()
                }
                t.b("  </tbody>")
                t.b("\n" + i)
                t.b("</table>")
                t.b("\n")
                return t.fl()
              },
              partials: {},
              subs: {},
            },
            '<style>\n  table {\n    text-align: center;\n    width: 100%;\n  }\n\n  .action-picto {\n    height: 50px;\n    width: 50px;\n    cursor: pointer;\n  }\n\n  .action-picto:hover:not(.disabled),\n  .edit-price:hover {\n    animation: button-bounce 300ms linear forwards;\n    filter: brightness(1.05) contrast(1.1);\n  }\n\n  .edit-price {\n    cursor: pointer;\n  }\n\n  img.disabled {\n    filter: grayscale(1);\n  }\n\n  .item-icon-container {\n    display: inline-block;\n    position: relative;\n  }\n\n  .item-icon {\n    width: 100px;\n    height: 100px;\n  }\n</style>\n\n<table>\n  <thead>\n    <tr>\n      <th>{{translate.market.wishlist.icon}}</th>\n      <th>{{translate.market.wishlist.name}}</th>\n      <th>{{translate.market.wishlist.price}}</th>\n      <th>{{translate.market.wishlist.status}}</th>\n      <th>{{translate.market.wishlist.actions}}</th>\n    </tr>\n  </thead>\n  <tbody>\n    {{#wishlist}}\n    <tr class="marketplace-abstract" data-icon="{{icon}}">\n      <!-- Icon -->\n      <td>\n        <div class="item-icon-container">\n          <img class="item-icon" src="{{icon}}" alt="{{name}}" />\n          <div class="rarity-marker-{{rarity}}"></div>\n        </div>\n      </td>\n\n      <!-- Name -->\n      <td>\n        <div class="abstract-name">{{name}}</div>\n        <div class="abstract-type">{{abstractType}}</div>\n      </td>\n\n      <!-- Price -->\n      <td>\n        <div\n          class="edit-price"\n          title="{{translate.market.wishlist.change_price}}"\n        >\n          <span class="price-item">{{price}}</span>\n          <span class="maana-icon" alt="maanas"></span>\n        </div>\n      </td>\n\n      <!-- Error -->\n      <td>\n        <p class="error">{{error}}</p>\n      </td>\n\n      <!-- Actions -->\n      <td>\n        <img\n          class="action-picto reset-item-status {{^error}}disabled{{/error}}"\n          src="/static/img/new-layout/wardrobe/reset-btn.png"\n          title="{{translate.market.wishlist.reset_tooltip}}"\n          alt="{{translate.market.wishlist.reset}}"\n        />\n        <img\n          class="action-picto delete-wishlist-item"\n          src="/static/img/new-layout/wardrobe/delete.png"\n          title="{{translate.market.wishlist.delete_tooltip}}"\n          alt="{{translate.market.wishlist.delete}}"\n        />\n      </td>\n    </tr>\n    {{/wishlist}}\n  </tbody>\n</table>\n',
            H
          )
          return T
        })()

        /***/
      },

    /***/ "./src/ajax/ajax_search.ts":
      /*!*********************************!*\
  !*** ./src/ajax/ajax_search.ts ***!
  \*********************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ ajaxSearch: () => /* binding */ ajaxSearch,
          /* harmony export */
        })
        /* harmony import */ var _marketplace_enums_body_location_enum__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../marketplace/enums/body_location.enum */ "./src/marketplace/enums/body_location.enum.ts"
          )
        /* harmony import */ var _marketplace_enums_category_enum__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../marketplace/enums/category.enum */ "./src/marketplace/enums/category.enum.ts"
          )
        /* harmony import */ var _marketplace_enums_guard_enum__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(
            /*! ../marketplace/enums/guard.enum */ "./src/marketplace/enums/guard.enum.ts"
          )
        /* harmony import */ var _marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_3__ =
          __webpack_require__(
            /*! ../marketplace/enums/rarity.enum */ "./src/marketplace/enums/rarity.enum.ts"
          )
        /* harmony import */ var _marketplace_enums_type_enum__WEBPACK_IMPORTED_MODULE_4__ =
          __webpack_require__(
            /*! ../marketplace/enums/type.enum */ "./src/marketplace/enums/type.enum.ts"
          )

        async function ajaxSearch(data) {
          data = {
            ...{
              type: _marketplace_enums_type_enum__WEBPACK_IMPORTED_MODULE_4__
                .Type.All,
              bodyLocation:
                _marketplace_enums_body_location_enum__WEBPACK_IMPORTED_MODULE_0__
                  .BodyLocation.All,
              category:
                _marketplace_enums_category_enum__WEBPACK_IMPORTED_MODULE_1__
                  .CategoryNumber.all,
              rarity:
                _marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_3__
                  .Rarity.all,
              price: "",
              guard:
                _marketplace_enums_guard_enum__WEBPACK_IMPORTED_MODULE_2__.Guard
                  .any,
              page: 1,
              name: "",
            },
            ...data,
          }
          const ITEMS_PER_PAGE = 8
          return await $.get("/marketplace/ajax_search", {
            ...data,
            from: (data.page - 1) * ITEMS_PER_PAGE,
            to: ITEMS_PER_PAGE,
          })
        }

        /***/
      },

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

        async function buy(itemId) {
          return new Promise(resolve => {
            void $.post(
              "/marketplace/buy",
              { id: itemId },
              json => {
                _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.meta =
                  json.meta
                resolve(json)
                if (json.result !== "success") {
                  $.flavrNotif(json.data)
                  return
                }
              },
              "json"
            )
          })
        }

        /***/
      },

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

        async function captureEnd() {
          return new Promise(resolve => {
            void $.post("/pet/capture/end", json => {
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.meta =
                json.meta
              resolve(json)
              if (json.result !== "success") {
                $.flavrNotif(json.data)
                return
              }
            })
          })
        }

        /***/
      },

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

        async function changeRegion(newRegionId) {
          return new Promise(resolve => {
            void $.post("/pet/changeRegion", { newRegionId }, json => {
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.meta =
                json.meta
              resolve(json)
              if (json.result !== "success") {
                $.flavrNotif(json.data)
                return
              }
              currentRegion = json.data.currentRegion
              pendingTreasureHuntLocation =
                typeof json.data.pendingTreasureHuntLocation === "undefined"
                  ? null
                  : json.data.pendingTreasureHuntLocation
              timeLeftExploration =
                typeof json.data.timeLeftExploration === "undefined"
                  ? null
                  : json.data.timeLeftExploration
            })
          })
        }

        /***/
      },

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

        async function explorationResults() {
          return new Promise(resolve => {
            void $.post("/pet/explorationResults", json => {
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.meta =
                json.meta
              resolve(json)
              if (json.result !== "success") {
                $.flavrNotif(json.data)
                return
              }
            })
          })
        }

        /***/
      },

    /***/ "./src/api/meta.ts":
      /*!*************************!*\
  !*** ./src/api/meta.ts ***!
  \*************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ PurroshopStatus: () =>
            /* binding */ PurroshopStatus,
          /* harmony export */
        })
        var PurroshopStatus
        ;(function (PurroshopStatus) {
          PurroshopStatus["disabled"] = "disabled"
          PurroshopStatus["enabled"] = "enabled"
        })(PurroshopStatus || (PurroshopStatus = {}))

        /***/
      },

    /***/ "./src/api/result.enum.ts":
      /*!********************************!*\
  !*** ./src/api/result.enum.ts ***!
  \********************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ Result: () => /* binding */ Result,
          /* harmony export */
        })
        var Result
        ;(function (Result) {
          Result["error"] = "error"
          Result["success"] = "success"
        })(Result || (Result = {}))

        /***/
      },

    /***/ "./src/appearance/appearance_ui.ts":
      /*!*****************************************!*\
  !*** ./src/appearance/appearance_ui.ts ***!
  \*****************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadAppearanceUI: () =>
            /* binding */ loadAppearanceUI,
          /* harmony export */
        })
        /* harmony import */ var _wardrobe__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(/*! ./wardrobe */ "./src/appearance/wardrobe.ts")

        function loadAppearanceUI() {
          setupBackground()
          setupLeftPanel()
          setupRightPanel()
          if (_wardrobe__WEBPACK_IMPORTED_MODULE_0__["default"].availableItems)
            availableItems =
              _wardrobe__WEBPACK_IMPORTED_MODULE_0__["default"].availableItems
          else
            _wardrobe__WEBPACK_IMPORTED_MODULE_0__["default"].availableItems =
              availableItems
        }
        function setupBackground() {
          const background = document.querySelector("#avatar-background img")
          if (background) {
            background.style.filter = "unset"
            background.style.height = "unset"
            background.style.mask =
              "linear-gradient(to right, black 50%, transparent 100%)"
            background.style.minHeight = "100vh"
            background.style.minWidth = "50vw"
            background.style.position = "fixed"
            background.style.transform = "unset"
            background.style.width = "unset"
          }
        }
        function setupRightPanel() {
          const rightPanel = document.getElementById("appearance-right")
          if (rightPanel) rightPanel.style.paddingTop = "80px"
        }
        function setupLeftPanel() {
          const previewOuter = document.getElementById(
            "appearance-preview-outer"
          )
          if (previewOuter) {
            previewOuter.style.padding = "0px"
          }
          const preview = document.getElementById("appearance-preview")
          if (preview) {
            preview.style.left = "0"
            preview.style.position = "fixed"
            preview.style.top = "calc(50% - var(--topbar-height))"
            preview.style.transform = "translateY(-50%)"
          }
          const canvas = document.querySelector("#appearance-preview canvas")
          if (canvas) {
            canvas.style.maxHeight = "100vh"
            canvas.style.maxWidth = "50vw"
          }
        }

        /***/
      },

    /***/ "./src/appearance/data_set.ts":
      /*!************************************!*\
  !*** ./src/appearance/data_set.ts ***!
  \************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ categoryContainerDataSet: () =>
            /* binding */ categoryContainerDataSet,
          /* harmony export */ categoryGroupDataSet: () =>
            /* binding */ categoryGroupDataSet,
          /* harmony export */ itemDataSet: () => /* binding */ itemDataSet,
          /* harmony export */
        })
        /* harmony import */ var _eldarya_util__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(/*! ../eldarya_util */ "./src/eldarya_util.ts")

        function categoryContainerDataSet(categoryContainer) {
          const { categoryid, category, categoryname } =
            categoryContainer.dataset
          if (!categoryid || !category || !categoryname) return
          return {
            categoryid: Number(categoryid),
            category: category,
            categoryname,
          }
        }
        function categoryGroupDataSet(groupItem, appearanceCategory) {
          const { itemid, group, name, rarity, rarityname } = groupItem.dataset
          if (!itemid || !group || !name || !rarity || !rarityname) return
          return {
            ...appearanceCategory,
            itemid: Number(itemid),
            group: Number(group),
            name,
            rarity,
            rarityname,
          }
        }
        function itemDataSet(li, appearanceGroup) {
          const { itemid, name, rarity, rarityname } = li.dataset
          const icon = li.querySelector("img")?.src
          if (!itemid || !name || !rarity || !rarityname || !icon) return
          return {
            ...appearanceGroup,
            itemid: Number(itemid),
            name,
            rarity,
            rarityname,
            icon: (0, _eldarya_util__WEBPACK_IMPORTED_MODULE_0__.trimIcon)(
              icon
            ),
          }
        }

        /***/
      },

    /***/ "./src/appearance/dressing_experience.ts":
      /*!***********************************************!*\
  !*** ./src/appearance/dressing_experience.ts ***!
  \***********************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadDressingExperience: () =>
            /* binding */ loadDressingExperience,
          /* harmony export */ loadBackground: () =>
            /* binding */ loadBackground,
          /* harmony export */
        })
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _ts_util__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(/*! ../ts_util */ "./src/ts_util.ts")
        /* harmony import */ var _ui_favourites__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(/*! ../ui/favourites */ "./src/ui/favourites.ts")
        /* harmony import */ var _appearance_ui__WEBPACK_IMPORTED_MODULE_3__ =
          __webpack_require__(
            /*! ./appearance_ui */ "./src/appearance/appearance_ui.ts"
          )
        /* harmony import */ var _data_set__WEBPACK_IMPORTED_MODULE_4__ =
          __webpack_require__(/*! ./data_set */ "./src/appearance/data_set.ts")
        /* harmony import */ var _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__ =
          __webpack_require__(
            /*! ./enums/appearance_category_code.enum */ "./src/appearance/enums/appearance_category_code.enum.ts"
          )
        /* harmony import */ var _favourites_actions__WEBPACK_IMPORTED_MODULE_6__ =
          __webpack_require__(
            /*! ./favourites_actions */ "./src/appearance/favourites_actions.ts"
          )
        /* harmony import */ var _hidden__WEBPACK_IMPORTED_MODULE_7__ =
          __webpack_require__(/*! ./hidden */ "./src/appearance/hidden.ts")
        /* harmony import */ var _wardrobe__WEBPACK_IMPORTED_MODULE_8__ =
          __webpack_require__(/*! ./wardrobe */ "./src/appearance/wardrobe.ts")

        async function loadDressingExperience() {
          if (!location.pathname.startsWith("/player/appearance")) return
          handledCategories.clear()
          loading = false
          ;(0, _appearance_ui__WEBPACK_IMPORTED_MODULE_3__.loadAppearanceUI)()
          // Setup categories
          for (const li of document.querySelectorAll(
            "#wardrobe-menu>li, #appearance-items-categories li"
          )) {
            const { category } = li.dataset
            if (
              !(0, _ts_util__WEBPACK_IMPORTED_MODULE_1__.isEnum)(
                category,
                _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__.AppearanceCategoryCode
              )
            )
              continue
            switch (category) {
              case _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
                .AppearanceCategoryCode.background:
                li.addEventListener("click", () =>
                  document.getElementById("ee-category")?.remove()
                )
                continue
              case _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
                .AppearanceCategoryCode.favorites:
                li.addEventListener("click", () => {
                  document.getElementById("ee-category")?.remove()
                  void handleCategory(category)
                })
                continue
              case _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
                .AppearanceCategoryCode.attic:
                continue
              default:
                li.addEventListener("click", () => {
                  document
                    .getElementById("appearance-items-category-favorites")
                    ?.remove()
                  void handleCategory(category)
                })
            }
          }
          await new Promise(resolve => setTimeout(resolve, 1000))
          await loadBackground()
        }
        /**
         * Get the category container for the clicked category and load its groups
         * @returns Category container
         */
        async function handleCategory(category) {
          const appearanceItems = document.querySelector("#appearance-items")
          if (!appearanceItems) return null
          const oldCatContainer = document.querySelector(
            `#appearance-items-category-${category}`
          )
          if (oldCatContainer) {
            await onAppearanceItemsCategory(
              category,
              appearanceItems,
              oldCatContainer
            )
            return oldCatContainer
          }
          return new Promise(resolve => {
            new MutationObserver((_, observer) => {
              const newCatContainer = document.querySelector(
                `#appearance-items-category-${category}`
              )
              if (!newCatContainer) return
              observer.disconnect()
              void (async () => {
                await onAppearanceItemsCategory(
                  category,
                  appearanceItems,
                  newCatContainer
                )
                resolve(newCatContainer)
              })()
            }).observe(appearanceItems, { childList: true })
          })
        }
        async function onAppearanceItemsCategory(
          category,
          appearanceItems,
          categoryContainer
        ) {
          if (
            category ===
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.favorites
          )
            (0, _ui_favourites__WEBPACK_IMPORTED_MODULE_2__.loadFavourites)()
          else {
            await new Promise(resolve => setTimeout(resolve, 220))
            loadEeItems(appearanceItems, categoryContainer)
            await handleGroups(categoryContainer)
          }
        }
        function loadEeItems(appearanceItems, categoryContainer) {
          // Get information about the current category
          const appearanceCategory = (0,
          _data_set__WEBPACK_IMPORTED_MODULE_4__.categoryContainerDataSet)(
            categoryContainer
          )
          if (!appearanceCategory) return null
          _wardrobe__WEBPACK_IMPORTED_MODULE_8__["default"].setCategory(
            appearanceCategory
          )
          categoryContainer.classList.remove("active")
          categoryContainer.style.display = "none"
          // Setup appearance_items_category
          const template = __webpack_require__(
            /*! ../templates/html/appearance_items_category.html */ "./src/templates/html/appearance_items_category.html"
          )
          document.getElementById("ee-category")?.remove()
          appearanceItems.insertAdjacentHTML(
            "beforeend",
            template.render({
              ...appearanceCategory,
              translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate,
            })
          )
          const eeItems = document.querySelector("#ee-items")
          if (!eeItems) return null
          eeItems.dataset.categoryid = appearanceCategory.categoryid.toString()
          eeItems.dataset.category = appearanceCategory.category
          eeItems.dataset.categoryname = appearanceCategory.categoryname
          return eeItems
        }
        const handledCategories = new Set()
        /** Load each groups synchronously and add them to a custom container. */
        async function handleGroups(categoryContainer) {
          const appearanceCategory = (0,
          _data_set__WEBPACK_IMPORTED_MODULE_4__.categoryContainerDataSet)(
            categoryContainer
          )
          if (!appearanceCategory) return
          _wardrobe__WEBPACK_IMPORTED_MODULE_8__["default"].setCategory(
            appearanceCategory
          )
          categoryContainer.classList.remove("active")
          categoryContainer.style.display = "none"
          const handled = handledCategories.has(appearanceCategory.category)
          handledCategories.add(appearanceCategory.category)
          ;(0, _hidden__WEBPACK_IMPORTED_MODULE_7__.loadHiddenCategory)(
            appearanceCategory.category
          )
          for (const li of categoryContainer.querySelectorAll(
            "li.appearance-item-group"
          )) {
            const appearanceGroup = (0,
            _data_set__WEBPACK_IMPORTED_MODULE_4__.categoryGroupDataSet)(
              li,
              appearanceCategory
            )
            if (!appearanceGroup?.group) break
            _wardrobe__WEBPACK_IMPORTED_MODULE_8__["default"].setGroup(
              appearanceGroup
            )
            if (
              !document.querySelector(
                `#appearance-items-group-${appearanceGroup.group}`
              ) &&
              !handled
              // && !loadHiddenGroup(appearanceGroup.group)
            )
              await (0,
              _favourites_actions__WEBPACK_IMPORTED_MODULE_6__.openGroup)(
                appearanceGroup.group
              )
            const div = document.querySelector(
              `#appearance-items-group-${appearanceGroup.group}`
            )
            if (!div) break
            div.classList.remove("active")
            const script = div.querySelector("script") // eslint-disable-next-line @typescript-eslint/no-implied-eval
            if (script) setTimeout(script.innerHTML, 0)
            const outerHTML = Array.from(
              div.querySelectorAll("li.appearance-item")
            )
              .map(li => {
                const appearanceItem = (0,
                _data_set__WEBPACK_IMPORTED_MODULE_4__.itemDataSet)(
                  li,
                  appearanceGroup
                )
                if (!appearanceItem?.icon) return li.outerHTML
                li.dataset.categoryid = appearanceItem.categoryid.toString()
                li.dataset.category = appearanceItem.category
                li.dataset.categoryname = appearanceItem.categoryname
                li.dataset.group = appearanceItem.group.toString()
                _wardrobe__WEBPACK_IMPORTED_MODULE_8__["default"].setItem(
                  appearanceItem
                )
                return li.outerHTML
              })
              .join("\n")
            _wardrobe__WEBPACK_IMPORTED_MODULE_8__["default"].availableItems =
              availableItems
            div.remove()
            const active = document.querySelector(
              `#wardrobe-menu li[data-category="${appearanceGroup.category}"].active`
            )
            if (active) {
              document
                .querySelector("#ee-items")
                ?.insertAdjacentHTML("beforeend", outerHTML)
              initializeSelectedItems()
              initializeHiddenCategories()
            } else if (handled) break
          }
          if (!handled) handledCategories.delete(appearanceCategory.category)
          ;(0, _hidden__WEBPACK_IMPORTED_MODULE_7__.unloadHiddenCategories)()
        }
        let loading = false
        async function loadBackground() {
          if (loading) return
          loading = true
          let success = true
          const categories = [
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.underwear,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.skin,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.tatoo,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.mouth,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.eye,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.hair,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.sock,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.shoe,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.pants,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.handAccessory,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.top,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.coat,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.glove,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.necklace,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.dress,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.hat,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.faceAccessory,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.belt,
            _enums_appearance_category_code_enum__WEBPACK_IMPORTED_MODULE_5__
              .AppearanceCategoryCode.ambient,
          ]
          const template = __webpack_require__(
            /*! ../templates/html/flavr_notif/icon_message.html */ "./src/templates/html/flavr_notif/icon_message.html"
          )
          for (const category of categories) {
            if (!location.pathname.startsWith("/player/appearance")) {
              success = false
              break
            }
            const active = document.querySelector(
              `#wardrobe-menu li[data-category="${category}"].active`
            )
            if (active) continue
            const categoryContainer = await (0,
            _favourites_actions__WEBPACK_IMPORTED_MODULE_6__.openCategory)(
              category
            )
            if (!categoryContainer) {
              success = false
              break
            }
            let finished = false
            setTimeout(() => {
              if (!finished)
                $.flavrNotif(
                  template.render({
                    icon: `/static/img/mall/categories/${category}.png`,
                    message:
                      _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.appearance.loading(
                        document.querySelector(
                          `#wardrobe-menu li[data-category="${category}"]`
                        )?.dataset.categoryname ?? category
                      ),
                  })
                )
            }, 1000)
            await handleGroups(categoryContainer)
            finished = true
          }
          if (success)
            $.flavrNotif(
              _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.appearance
                .loaded
            )
          loading = false
        }

        /***/
      },

    /***/ "./src/appearance/enums/appearance_category_code.enum.ts":
      /*!***************************************************************!*\
  !*** ./src/appearance/enums/appearance_category_code.enum.ts ***!
  \***************************************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ AppearanceCategoryCode: () =>
            /* binding */ AppearanceCategoryCode,
          /* harmony export */
        })
        var AppearanceCategoryCode
        ;(function (AppearanceCategoryCode) {
          AppearanceCategoryCode["attic"] = "attic"
          AppearanceCategoryCode["favorites"] = "favorites"
          AppearanceCategoryCode["underwear"] = "underwear"
          AppearanceCategoryCode["skin"] = "skin"
          AppearanceCategoryCode["tatoo"] = "tatoo"
          AppearanceCategoryCode["mouth"] = "mouth"
          AppearanceCategoryCode["eye"] = "eye"
          AppearanceCategoryCode["hair"] = "hair"
          AppearanceCategoryCode["sock"] = "sock"
          AppearanceCategoryCode["shoe"] = "shoe"
          AppearanceCategoryCode["pants"] = "pants"
          AppearanceCategoryCode["handAccessory"] = "handAccessory"
          AppearanceCategoryCode["top"] = "top"
          AppearanceCategoryCode["coat"] = "coat"
          AppearanceCategoryCode["glove"] = "glove"
          AppearanceCategoryCode["necklace"] = "necklace"
          AppearanceCategoryCode["dress"] = "dress"
          AppearanceCategoryCode["hat"] = "hat"
          AppearanceCategoryCode["faceAccessory"] = "faceAccessory"
          AppearanceCategoryCode["background"] = "background"
          AppearanceCategoryCode["belt"] = "belt"
          AppearanceCategoryCode["ambient"] = "ambient"
        })(AppearanceCategoryCode || (AppearanceCategoryCode = {}))

        /***/
      },

    /***/ "./src/appearance/fake_favourites.ts":
      /*!*******************************************!*\
  !*** ./src/appearance/fake_favourites.ts ***!
  \*******************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ saveFavourite: () => /* binding */ saveFavourite,
          /* harmony export */ showFavourite: () => /* binding */ showFavourite,
          /* harmony export */
        })
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../indexed_db/indexed_db */ "./src/indexed_db/indexed_db.ts"
          )
        /* harmony import */ var _outfit__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(/*! ../outfit */ "./src/outfit.ts")
        /* harmony import */ var _ui_favourites__WEBPACK_IMPORTED_MODULE_3__ =
          __webpack_require__(/*! ../ui/favourites */ "./src/ui/favourites.ts")
        /* harmony import */ var _favourites_actions__WEBPACK_IMPORTED_MODULE_4__ =
          __webpack_require__(
            /*! ./favourites_actions */ "./src/appearance/favourites_actions.ts"
          )

        async function saveFavourite() {
          const favourite = await showOutfit()
          if (favourite)
            await (0,
            _ui_favourites__WEBPACK_IMPORTED_MODULE_3__.loadFakeFavourites)()
          return favourite
        }
        async function deleteFavourite(favourite) {
          await _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__[
            "default"
          ].deleteFavouriteOutfit(favourite)
          await (0,
          _ui_favourites__WEBPACK_IMPORTED_MODULE_3__.loadFakeFavourites)()
        }
        async function showOutfit() {
          const template = __webpack_require__(
            /*! ../templates/html/created_outfit_flavr.html */ "./src/templates/html/created_outfit_flavr.html"
          )
          return new Promise(resolve =>
            $.flavr({
              content: template.render({
                translate:
                  _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate,
              }),
              onBuild: $container => {
                $container.addClass("new-layout-popup")
                $container.addClass("created-outfit-popup")
                const saveButton = document.querySelector('[rel="btn-save"]')
                if (!saveButton) return
                document
                  .querySelector("#choose-name")
                  ?.addEventListener("keyup", event => {
                    if (event.key === "Enter") saveButton.click()
                    if (document.querySelector("#choose-name")?.value)
                      saveButton.classList.remove("disabled")
                    else saveButton.classList.add("disabled")
                  })
                saveButton.classList.add(
                  "nl-button",
                  "nl-button-lg",
                  "disabled"
                )
              },
              buttons: {
                close: {
                  text: "",
                  style: "close",
                  action: () => {
                    resolve(null)
                    return true
                  },
                },
                save: {
                  text: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate
                    .appearance.favourites.save_outfit.save,
                  style: "default",
                  action: () => {
                    const name = document.querySelector("#choose-name")?.value
                    if (!name) return false
                    const avatar = Sacha.Avatar.avatars["#appearance-preview"]
                    if (!avatar) return false
                    const items = (0,
                    _outfit__WEBPACK_IMPORTED_MODULE_2__.parseAvatar)(avatar)
                    void saveAction(name, items, resolve)
                    return true
                  },
                },
              },
            })
          )
        }
        function showFavourite(favourite) {
          const template = __webpack_require__(
            /*! ../templates/html/favourite_outfit_flavr.html */ "./src/templates/html/favourite_outfit_flavr.html"
          )
          $.flavr({
            content: template.render({
              ...favourite,
              translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate,
            }),
            onBuild: $container => {
              $container.addClass("new-layout-popup")
              $container.addClass("created-outfit-popup")
            },
            buttons: {
              close: {
                text: "",
                style: "close",
                action: () => true,
              },
              delete: {
                text: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate
                  .appearance.favourites.click_outfit["delete"],
                style: "default",
                action: () => {
                  void deleteFavourite(favourite)
                  return true
                },
              },
              wear: {
                text: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate
                  .appearance.favourites.click_outfit.wear,
                style: "default",
                action: () => {
                  const avatar = Sacha.Avatar.avatars["#appearance-preview"]
                  if (!avatar) return false
                  void (async () =>
                    (0,
                    _favourites_actions__WEBPACK_IMPORTED_MODULE_4__.wearOutfit)(
                      avatar,
                      favourite.items
                    ))()
                  return true
                },
              },
            },
          })
        }
        async function saveAction(name, items, resolve) {
          const blob = await new Promise(resolve => {
            document
              .querySelector("#appearance-preview canvas")
              ?.toBlob(blob => resolve(blob), "image/png", 1)
          })
          resolve({
            ...(await _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__[
              "default"
            ].addFavouriteOutfit({
              items,
              name,
              blob,
            })),
            url: URL.createObjectURL(blob),
          })
        }

        /***/
      },

    /***/ "./src/appearance/favourites_actions.ts":
      /*!**********************************************!*\
  !*** ./src/appearance/favourites_actions.ts ***!
  \**********************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ exportPreview: () => /* binding */ exportPreview,
          /* harmony export */ importOutfit: () => /* binding */ importOutfit,
          /* harmony export */ openGroup: () => /* binding */ openGroup,
          /* harmony export */ openCategory: () => /* binding */ openCategory,
          /* harmony export */ wearOutfit: () => /* binding */ wearOutfit,
          /* harmony export */
        })
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _outfit__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(/*! ../outfit */ "./src/outfit.ts")

        function exportPreview() {
          ;(0, _outfit__WEBPACK_IMPORTED_MODULE_1__.exportOutfit)(
            "#appearance-preview"
          )
        }
        function importOutfit() {
          const input = document.createElement("input")
          input.setAttribute("type", "file")
          input.setAttribute("accept", "application/json")
          input.click()
          input.addEventListener("input", event => {
            if (!event.target) return
            const files = event.target.files
            if (!files) return
            const file = files[0]
            if (!file) return
            void file.text().then(async value => {
              if (!value) return
              const outfit = JSON.parse(value)
              const avatar = Sacha.Avatar.avatars["#appearance-preview"]
              if (!avatar) return
              await wearOutfit(avatar, outfit)
            })
          })
        }
        function removeClothes() {
          const avatar = Sacha.Avatar.avatars["#appearance-preview"]
          if (!avatar) return
          for (let i = avatar.children.length - 1; i >= 0; i--) {
            const itemRender = avatar.children[i]
            if (!itemRender) continue
            const item = itemRender.getItem()
            if (Sacha.Avatar.removeItemFromAllAvatars(item)) {
              $(`#appearance-item-${item._id}`).removeClass("selected")
            }
          }
        }
        async function openGroup(group) {
          return new Promise(resolve => {
            const groupContainer = document.querySelector(
              `#appearance-items-group-${group}`
            )
            if (groupContainer) return void resolve(groupContainer)
            const avatar = Sacha.Avatar.avatars["#appearance-preview"]
            if (!avatar) return void resolve(null)
            void $.get(
              `/player/openGroup/${group}`,
              { wornItems: avatar.getItemsToSave() },
              view => {
                $(view).hide().appendTo("#appearance-items")
                resolve(
                  document.querySelector(`#appearance-items-group-${group}`)
                )
              }
            )
          })
        }
        async function openCategory(category) {
          return new Promise(resolve => {
            const categoryContainer = document.querySelector(
              `#appearance-items-category-${category}`
            )
            if (categoryContainer) return void resolve(categoryContainer)
            void $.post(`/player/openCategory/${category}`, view => {
              $(view).hide().appendTo("#appearance-items")
              resolve(
                document.querySelector(`#appearance-items-category-${category}`)
              )
            })
          })
        }
        async function wearOutfit(avatar, outfit) {
          $.flavrNotif(
            _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.appearance
              .favourites.importing
          )
          // Get all categories
          const categories = new Set()
          for (const clothing of outfit)
            if (!availableItems[clothing.id]) categories.add(clothing.type)
          // Open all categories
          await Promise.all(
            Array.from(categories.values()).map(async category =>
              openCategory(category)
            )
          )
          // Get all groups
          const groups = new Set()
          for (const clothing of outfit)
            if (
              document.querySelector(`[data-group="${clothing.group}"]`) &&
              !availableItems[clothing.id]
            )
              groups.add(clothing.group)
          // Open all groups
          await Promise.all(
            Array.from(groups.values()).map(async group => openGroup(group))
          )
          // Get the items from `availableItems`
          const wornItems = []
          for (const clothing of outfit) {
            const item = availableItems[clothing.id]
            if (item) wornItems.push(item)
          }
          removeClothes()
          avatar.addItems(wornItems)
          initializeSelectedItems()
          initializeHiddenCategories()
          const avatarActions = document.getElementById("avatar-actions")
          if (avatarActions) avatarActions.style.display = "initial"
          $.flavrNotif(
            _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.appearance
              .favourites.imported
          )
        }

        /***/
      },

    /***/ "./src/appearance/hidden.ts":
      /*!**********************************!*\
  !*** ./src/appearance/hidden.ts ***!
  \**********************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ unloadHiddenCategories: () =>
            /* binding */ unloadHiddenCategories,
          /* harmony export */ loadHiddenCategory: () =>
            /* binding */ loadHiddenCategory,
          /* harmony export */ loadHiddenGroup: () =>
            /* binding */ loadHiddenGroup,
          /* harmony export */
        })
        /* harmony import */ var _wardrobe__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(/*! ./wardrobe */ "./src/appearance/wardrobe.ts")

        function unloadHiddenCategories() {
          const hidden = document.querySelectorAll(
            "#appearance-items .appearance-items-category:not(.active):not([data-categoryname]), #appearance-items script, body>script"
          )
          for (const div of hidden) {
            div.remove()
          }
        }
        /**
         * Place the saved groups on the DOM as if it was Eldarya doing it.
         * @returns the associated `AppearanceCategory` if it's found in the wardrobe.
         */
        function loadHiddenCategory(code) {
          const category = _wardrobe__WEBPACK_IMPORTED_MODULE_0__["default"]
            .getCategories()
            .find(c => c.category === code)
          if (!category) return null
          const groups = _wardrobe__WEBPACK_IMPORTED_MODULE_0__[
            "default"
          ].getCategoryGroups(category.categoryid)
          const itemTemplate = __webpack_require__(
            /*! ../templates/html/appearance_item.html */ "./src/templates/html/appearance_item.html"
          )
          const groupTemplate = __webpack_require__(
            /*! ../templates/html/appearance_items_group.html */ "./src/templates/html/appearance_items_group.html"
          )
          document.querySelector("#appearance-items")?.insertAdjacentHTML(
            "beforeend",
            groups
              .map(group =>
                groupTemplate.render({
                  ...group,
                  items: _wardrobe__WEBPACK_IMPORTED_MODULE_0__["default"]
                    .getItems(group.group)
                    .map(item => itemTemplate.render(item))
                    .join("\n"),
                })
              )
              .join("\n")
          )
          return category
        }
        /**
         * Load the saved group on the DOM as if it was Eldarya doing it.
         * @returns the associated `AppearanceGroup` if it's found in the wardrobe.
         */
        function loadHiddenGroup(id) {
          const group =
            _wardrobe__WEBPACK_IMPORTED_MODULE_0__["default"].getGroup(id)
          if (!group) return null
          const itemTemplate = __webpack_require__(
            /*! ../templates/html/appearance_item.html */ "./src/templates/html/appearance_item.html"
          )
          const groupTemplate = __webpack_require__(
            /*! ../templates/html/appearance_items_group.html */ "./src/templates/html/appearance_items_group.html"
          )
          document.querySelector("#appearance-items")?.insertAdjacentHTML(
            "beforeend",
            groupTemplate.render({
              ...group,
              items: _wardrobe__WEBPACK_IMPORTED_MODULE_0__["default"]
                .getItems(group.group)
                .map(item => itemTemplate.render(item))
                .join("\n"),
            })
          )
          return group
        }

        /***/
      },

    /***/ "./src/appearance/wardrobe.ts":
      /*!************************************!*\
  !*** ./src/appearance/wardrobe.ts ***!
  \************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
          /* harmony export */
        })
        class Wardrobe {
          categories = {}
          groups = {}
          items = {}
          availableItems
          getCategories() {
            return Object.values(this.categories)
          }
          getCategory(id) {
            return this.categories[id]
          }
          getCategoryGroups(categoryid) {
            return Object.values(this.groups).filter(
              group => group.categoryid === categoryid
            )
          }
          getGroup(id) {
            return this.groups[id]
          }
          getGroups() {
            return Object.values(this.groups)
          }
          getItem(id) {
            return this.items[id]
          }
          getItems(group) {
            return Object.values(this.items).filter(
              item => item.group === group
            )
          }
          setCategory(category) {
            this.categories[category.categoryid] = category
          }
          setGroup(group) {
            this.groups[group.group] = group
          }
          setItem(item) {
            this.items[item.itemid] = item
          }
        }
        /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ =
          new Wardrobe()

        /***/
      },

    /***/ "./src/carousel/carousel_beemoov_annoyances.ts":
      /*!*****************************************************!*\
  !*** ./src/carousel/carousel_beemoov_annoyances.ts ***!
  \*****************************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ carouselBeemoovAnnoyances: () =>
            /* binding */ carouselBeemoovAnnoyances,
          /* harmony export */
        })
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )

        const carouselBeemoovAnnoyances = {
          backgroundImage:
            "https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/carousel_beemoov_annoyances.png",
          h4: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel
            .beemoov_annoyances.title,
          href: "https://gitlab.com/NatoBoram/Beemoov-Annoyances",
          id: "carousel-beemoov-annoyances",
          p: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel
            .beemoov_annoyances.subtitle,
        }

        /***/
      },

    /***/ "./src/carousel/carousel_download_face.ts":
      /*!************************************************!*\
  !*** ./src/carousel/carousel_download_face.ts ***!
  \************************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ carouselDownloadFace: () =>
            /* binding */ carouselDownloadFace,
          /* harmony export */
        })
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )

        const carouselDownloadFace = {
          backgroundImage:
            "https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/carousel_download_face.png",
          id: "carousel-download-face",
          h4: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel
            .download_face.title,
          p: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel
            .download_face.subtitle,
        }

        /***/
      },

    /***/ "./src/carousel/carousel_download_guardian.ts":
      /*!****************************************************!*\
  !*** ./src/carousel/carousel_download_guardian.ts ***!
  \****************************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ carouselDownloadGuardian: () =>
            /* binding */ carouselDownloadGuardian,
          /* harmony export */
        })
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )

        const carouselDownloadGuardian = {
          backgroundImage:
            "https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/carousel_download_guardian.png",
          id: "carousel-download-guardian",
          h4: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel
            .download_guardian.title,
          p: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel
            .download_guardian.subtitle,
        }

        /***/
      },

    /***/ "./src/carousel/carousel_eldarya_enhancements.ts":
      /*!*******************************************************!*\
  !*** ./src/carousel/carousel_eldarya_enhancements.ts ***!
  \*******************************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ carouselEE: () => /* binding */ carouselEE,
          /* harmony export */
        })
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )

        const carouselEE = {
          backgroundImage:
            "https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/carousel_eldarya_enhancements.png",
          h4: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel
            .eldarya_enhancements.title,
          href: GM.info.script.namespace,
          id: "carousel-eldarya-enhancements",
          p: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel
            .eldarya_enhancements.subtitle,
        }

        /***/
      },

    /***/ "./src/carousel/carousel_takeover.ts":
      /*!*******************************************!*\
  !*** ./src/carousel/carousel_takeover.ts ***!
  \*******************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ carouselTakeover: () =>
            /* binding */ carouselTakeover,
          /* harmony export */
        })
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )

        const carouselTakeover = {
          backgroundImage:
            "https://gitlab.com/NatoBoram/eldarya-enhancements/-/raw/master/images/carousel_takeover.png",
          id: "carousel-takeover",
          h4: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel
            .takeover.title,
          p: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.carousel
            .takeover.subtitle,
        }

        /***/
      },

    /***/ "./src/cheat_codes.ts":
      /*!****************************!*\
  !*** ./src/cheat_codes.ts ***!
  \****************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadCheatCodes: () =>
            /* binding */ loadCheatCodes,
          /* harmony export */
        })
        /* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ./local_storage/local_storage */ "./src/local_storage/local_storage.ts"
          )
        /* eslint-disable @typescript-eslint/no-explicit-any */
        /* eslint-disable @typescript-eslint/no-unsafe-member-access */

        function loadCheatCodes() {
          // const cheated = window as unknown as CheatedWindow
          window.unlockEnhancements = unlockEnhancements
          window.lockEnhancements = lockEnhancements
        }
        async function unlockEnhancements() {
          _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.unlocked = true
          console.info("Unlocked enhancements.")
          await reload()
        }
        async function lockEnhancements() {
          _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.unlocked = false
          console.info("Locked enhancements.")
          await reload()
        }
        async function reload() {
          await new Promise(resolve => setTimeout(resolve, 1000))
          console.log("Reloading...")
          await new Promise(resolve => setTimeout(resolve, 1000))
          location.reload()
        }

        /***/
      },

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

        class Console {
          static console = console
          constructor() {}
          static get debugging() {
            return _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__
              .LocalStorage.debug
          }
          static get time() {
            return new Date().toLocaleTimeString()
          }
          static assert(value, message, ...optionalParams) {
            if (!this.debugging) return
            this.console.assert(
              value,
              ...this.format(message),
              ...optionalParams
            )
          }
          static debug(message, ...optionalParams) {
            if (!this.debugging) return
            this.console.debug(...this.format(message), ...optionalParams)
          }
          static error(message, ...optionalParams) {
            this.console.error(...this.format(message), ...optionalParams)
          }
          static info(message, ...optionalParams) {
            if (!this.debugging) return
            this.console.info(...this.format(message), ...optionalParams)
          }
          static log(message, ...optionalParams) {
            if (!this.debugging) return
            this.console.log(...this.format(message), ...optionalParams)
          }
          static warn(message, ...optionalParams) {
            this.console.warn(...this.format(message), ...optionalParams)
          }
          static format(message) {
            return [
              `%c[%c${this.time}%c]`,
              "color:#9742c2",
              "color:none",
              "color:#9742c2",
              message,
            ]
          }
        }

        /***/
      },

    /***/ "./src/download-canvas.ts":
      /*!********************************!*\
  !*** ./src/download-canvas.ts ***!
  \********************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ downloadFace: () => /* binding */ downloadFace,
          /* harmony export */ downloadGuardian: () =>
            /* binding */ downloadGuardian,
          /* harmony export */ downloadAppearance: () =>
            /* binding */ downloadAppearance,
          /* harmony export */ downloadProfile: () =>
            /* binding */ downloadProfile,
          /* harmony export */ getName: () => /* binding */ getName,
          /* harmony export */
        })
        /* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(/*! ./console */ "./src/console.ts")
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(/*! ./i18n/translate */ "./src/i18n/translate.ts")

        function downloadCanvas(canvas, name) {
          canvas.toBlob(
            blob => {
              if (!blob) {
                _console__WEBPACK_IMPORTED_MODULE_0__.Console.error(
                  "Canvas is empty"
                )
                $.flavrNotif(
                  _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.error
                    .downloadCanvas
                )
                return
              }
              const url = URL.createObjectURL(blob)
              const a = document.createElement("a")
              a.setAttribute("href", url)
              a.setAttribute("download", `${name}.png`)
              a.style.display = "none"
              document.body.appendChild(a)
              a.click()
              document.body.removeChild(a)
              URL.revokeObjectURL(url)
            },
            "image/png",
            1
          )
        }
        function downloadFace() {
          const canvas = document.querySelector("#avatar-menu-container canvas")
          if (!canvas) {
            console.warn("Couldn't find the guardian's face.")
            return
          }
          downloadCanvas(canvas, "face")
        }
        function downloadGuardian() {
          const canvas = document.querySelector("#home-avatar-player canvas")
          if (!canvas) {
            console.warn("Couldn't find the guardian.")
            return
          }
          downloadCanvas(canvas, getName() ?? "guardian")
        }
        function downloadAppearance() {
          const canvas = document.querySelector("#appearance-preview canvas")
          if (!canvas) {
            console.warn("Couldn't find the guardian.")
            return
          }
          downloadCanvas(canvas, getName() ?? "guardian")
        }
        function downloadProfile() {
          const canvas = document.querySelector(".playerProfileAvatar canvas")
          const title = document.querySelector("#main-section .section-title")
          if (!canvas || !title) return
          downloadCanvas(canvas, title.textContent?.trim() ?? "guardian")
        }
        function getName() {
          return (
            document.querySelector("#avatar-menu-container-outer>p")
              ?.textContent ?? null
          )
        }

        /***/
      },

    /***/ "./src/duration.ts":
      /*!*************************!*\
  !*** ./src/duration.ts ***!
  \*************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ DurationUnit: () => /* binding */ DurationUnit,
          /* harmony export */ Duration: () => /* binding */ Duration,
          /* harmony export */
        })
        var DurationUnit
        ;(function (DurationUnit) {
          DurationUnit[(DurationUnit["millisecond"] = 1)] = "millisecond"
          DurationUnit[(DurationUnit["second"] = 1000)] = "second"
          DurationUnit[(DurationUnit["minute"] = 60000)] = "minute"
          DurationUnit[(DurationUnit["hour"] = 3600000)] = "hour"
          DurationUnit[(DurationUnit["day"] = 86400000)] = "day"
          DurationUnit[(DurationUnit["week"] = 604800000)] = "week"
        })(DurationUnit || (DurationUnit = {}))
        class Duration {
          value
          unit
          constructor(value, unit) {
            this.value = value
            this.unit = unit
          }
          divide(duration) {
            return new Duration(
              this.value / duration.to(this.unit).value,
              this.unit
            )
          }
          minus(duration) {
            return new Duration(
              this.value - duration.to(this.unit).value,
              this.unit
            )
          }
          multiply(duration) {
            return new Duration(
              this.value * duration.to(this.unit).value,
              this.unit
            )
          }
          plus(duration) {
            return new Duration(
              this.value + duration.to(this.unit).value,
              this.unit
            )
          }
          to(unit) {
            return new Duration((this.value * this.unit) / unit, unit)
          }
        }

        /***/
      },

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

        /***/
      },

    /***/ "./src/eldarya_util.ts":
      /*!*****************************!*\
  !*** ./src/eldarya_util.ts ***!
  \*****************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ trimIcon: () => /* binding */ trimIcon,
          /* harmony export */
        })
        function trimIcon(icon) {
          const tilde = icon.lastIndexOf("~")
          const dot = icon.lastIndexOf(".")
          if (tilde === -1 || dot === -1) return icon
          return icon.substring(0, tilde) + icon.substring(dot)
        }

        /***/
      },

    /***/ "./src/i18n/en.ts":
      /*!************************!*\
  !*** ./src/i18n/en.ts ***!
  \************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ en: () => /* binding */ en,
          /* harmony export */
        })
        const en = {
          home: {
            forum: "Forum",
            takeover: "Takeover",
          },
          takeover: {
            bought: (name, price) =>
              `Bought <strong>${name}</strong> for <strong class="price-item">${price}</strong> <span class="maana-icon" alt="maanas"></span>.`,
            disabled: "Takeover mode disabled.",
            enabled:
              "Takeover mode enabled. Please do not interact with this tab.",
          },
          carousel: {
            beemoov_annoyances: {
              title: "Beemoov Annoyances",
              subtitle: "Block some of Eldarya's annoyances.",
            },
            download_face: {
              title: "Download your guardian's face!",
              subtitle: "Click here to download your guardian's face.",
            },
            download_guardian: {
              title: "Download your guardian!",
              subtitle: "Click here to download your guardian.",
            },
            eldarya_enhancements: {
              title: `${GM.info.script.name} v${GM.info.script.version}`,
              subtitle: GM.info.script.description,
            },
            takeover: {
              disable_takeover: "Disable Takeover",
              enable_takeover: "Enable Takeover",
              subtitle: "Give up this tab to perform automated actions.",
              title: "Takeover",
            },
          },
          minigames: {
            played_for: (name, maanas) =>
              `Played <strong>${name}</strong> for <strong class="price-item">${maanas}</strong> <span class="maana-icon" alt="maanas"></span> earned.`,
            played: name => `Played <strong>${name}</strong>.`,
            playing: name => `Playing <strong>${name}</strong>...`,
          },
          appearance: {
            buttons: {
              backward: "Move back",
              forward: "Bring forward",
            },
            favourites: {
              imported: "Imported outfit!",
              importing: "Importing outfit. Please wait...",
              click_outfit: {
                delete: "Delete",
                goto_account: `To transfer your <strong>${GM.info.script.name}</strong> favourite outfits to another browser, export your settings in the <a href="/user/account" style="text-decoration: underline;">my&nbsp;account</a> page.`,
                saved_locally: `Take note that this outfit is saved in <strong>${GM.info.script.name}</strong>' settings and was not sent to Eldarya's servers.`,
                wear: "Wear",
              },
              save_outfit: {
                goto_account: `To transfer your <strong>${GM.info.script.name}</strong> favourite outfits to another browser, export your settings in the <a href="/user/account" style="text-decoration: underline;">my&nbsp;account</a> page.`,
                placeholder: "Name...",
                save: "Save",
                saved_locally: `Take note that this outfit will only be saved within <strong>${GM.info.script.name}</strong>' settings and will not be sent to Eldarya's servers.`,
                title: "Save outfit",
              },
              buttons: {
                download: "Download PNG",
                export: "Export",
                import: "Import",
              },
            },
            loaded: "The wardrobe is loaded.",
            loading: categoryname =>
              `Loading <strong>${categoryname}</strong>...`,
          },
          market: {
            add_to_wishlist: {
              added_to_wishlist: (name, price) =>
                `Added <strong>${name}</strong> for <strong class="price-item">${price}</strong> <span class="maana-icon" alt="maanas"></span> to the wishlist.`,
              invalid_price: "This is not a valid price.",
              save: "Save",
              text: "How many maanas do you wish to offer to acquire this item?",
              title: "Add to wishlist",
            },
            auctions: {
              buy_now_price: "Buy now price :",
              current_price: "Current price :",
              delete: "Delete",
              purchase_history: "Purchase history",
              sales_history: "Sales history",
              date_time_format: new Intl.DateTimeFormat("en-GB", {
                minute: "2-digit",
                hour: "2-digit",
                day: "numeric",
                month: "long",
                year: "numeric",
              }),
            },
            change_price: {
              changed_price: (name, price) =>
                `Changed <strong>${name}</strong>'s price for <strong class="price-item">${price}</strong> <span class="maana-icon" alt="maanas"></span>.`,
              invalid_price: "This is not a valid price.",
              save: "Save",
              text: "How many maanas do you wish to offer to acquire this item?",
              title: "Change price",
            },
            wishlist: {
              assistance: `On this page, you can organize your wishlist and check the status of your wished items. Please note that your wishlist is saved locally in <strong>${GM.info.script.name}</strong>' settings and is not sent to Eldarya's servers. To transfer your wishlist to another browser, export your settings in the <a href="/user/account" style="text-decoration: underline;">my&nbsp;account</a> page.`,
              actions: "Actions",
              change_price: "Change price",
              delete_tooltip: "Remove from wishlist",
              delete: "Delete",
              icon: "Icon",
              name: "Name",
              price: "Price",
              reset_tooltip: "Reset the error status",
              reset: "Reset",
              status: "Status",
              title: "Wishlist",
            },
          },
          account: {
            debug_tooltip: "Enables or disables logging.",
            debug: "Debug",
            enhancements: "Enhancements",
            explorations: "Explorations",
            export: "Export settings",
            import: "Import settings",
            imported: "Imported settings!",
            market: "Market",
            minigames: "Minigames",
          },
          pet: {
            auto_explore: "Highlight",
            date_time_format: new Intl.DateTimeFormat("en-GB", {
              minute: "2-digit",
              hour: "2-digit",
              day: "numeric",
              month: "long",
              year: "numeric",
            }),
            delete_history: "Delete history",
            empty_history:
              "Your exploration history is empty. It will automatically fill up as your familiar finds items while exploring.",
            goto_account: `To transfer your exploration history to another browser, export your settings from the <em>my&nbsp;account</em> page.`,
            history: "History",
            saved_locally: `Please note that your exploration history is saved locally in <strong>${GM.info.script.name}</strong>' settings and was not sent to Eldarya's servers.`,
          },
          profile: {
            export_outfit: "Export outfit",
            download_outfit: "Download PNG",
          },
          error: {
            downloadCanvas: "There was an error while creating the image.",
          },
          mall: {
            add_to_wishlist: {
              title: "Add to market wishlist",
              text: "How many maanas do you wish to offer to acquire this item?",
              note: "Please note that the items added from the mall will not necessarily be available at the market.",
            },
          },
        }
        Object.freeze(en)

        /***/
      },

    /***/ "./src/i18n/fr.ts":
      /*!************************!*\
  !*** ./src/i18n/fr.ts ***!
  \************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ fr: () => /* binding */ fr,
          /* harmony export */
        })
        const fr = {
          home: {
            forum: "Forum",
            takeover: "Takeover",
          },
          takeover: {
            bought: (name, price) =>
              `Acheté <strong>${name}</strong> pour <strong class="price-item">${price}</strong> <span class="maana-icon" alt="maanas"></span>.`,
            disabled: "Takeover désactivé.",
            enabled: "Takeover activé. Évite d'intéragir avec cet onglet.",
          },
          carousel: {
            beemoov_annoyances: {
              title: "Beemoov Annoyances",
              subtitle: "Bloque certains irritants d'Eldarya.",
            },
            download_face: {
              title: "Télécharge le visage de ta gardienne!",
              subtitle:
                "Clique ici pour télécharger le visage de ta gardienne.",
            },
            download_guardian: {
              title: "Télécharge ta gardienne!",
              subtitle: "Clique ici pour télécharger ta gardienne.",
            },
            eldarya_enhancements: {
              title: `${GM.info.script.name} v${GM.info.script.version}`,
              subtitle: "Améliore l'expérience utilisateur d'Eldarya.",
            },
            takeover: {
              disable_takeover: "Désactive le takeover",
              enable_takeover: "Active le takeover",
              subtitle: "Laisse cet onglet performer des actions automatiques.",
              title: "Takeover",
            },
          },
          minigames: {
            played_for: (name, maanas) =>
              `A joué à <strong>${name}</strong> pour <strong class="price-item">${maanas}</strong> <span class="maana-icon" alt="maanas"></span> gagnés.`,
            played: name => `A joué à <strong>${name}</strong>.`,
            playing: name => `Joue à <strong>${name}</strong>...`,
          },
          appearance: {
            buttons: {
              backward: "Vers l'arrière",
              forward: "Vers l'avant",
            },
            favourites: {
              imported: "Importation réussie!",
              importing: "Importation en cours...",
              click_outfit: {
                delete: "Supprimer",
                goto_account: `Pour transférer tes tenues favorites d'<strong>${GM.info.script.name}</strong> vers un autre navigateur, exporte tes paramètres à partir de la page <a href="/user/account" style="text-decoration: underline;">mon&nbsp;compte</a>.`,
                saved_locally: `Prends note que cette tenue est sauvegardée localement dans les paramètres d'<strong>${GM.info.script.name}</strong> et n'a pas été envoyée aux serveurs d'Eldarya.`,
                wear: "Porter",
              },
              save_outfit: {
                goto_account: `Pour transférer tes tenues favorites d'<strong>${GM.info.script.name}</strong> vers un autre navigateur, exporte tes paramètres à partir de la page <a href="/user/account" style="text-decoration: underline;">mon&nbsp;compte</a>.`,
                placeholder: "Nom...",
                save: "Sauvegarder",
                saved_locally: `Prends note que cette tenue sera sauvegardée localement dans les paramètres d'<strong>${GM.info.script.name}</strong> et ne sera pas envoyée aux serveurs d'Eldarya.`,
                title: "Sauvegarder cette tenue",
              },
              buttons: {
                download: "Télécharger le PNG",
                export: "Exporter",
                import: "Importer",
              },
            },
            loaded: "Le chargement de la garde-robe est terminé.",
            loading: categoryname =>
              `Chargement de <strong>${categoryname}</strong>...`,
          },
          market: {
            add_to_wishlist: {
              added_to_wishlist: (name, price) =>
                `Ajouté <strong>${name}</strong> pour <strong class="price-item">${price}</strong> <span class="maana-icon" alt="maanas"></span> à la liste de souhaits.`,
              invalid_price: "Ce prix n'est pas valide.",
              save: "Sauvegarder",
              text: "Combien de maanas souhaites-tu offrir pour acquérir cet item?",
              title: "Ajouter à la liste de souhait",
            },
            auctions: {
              buy_now_price: "Achat immédiat :",
              current_price: "Mise actuelle :",
              delete: "Supprimer",
              purchase_history: "Historique d'achat",
              sales_history: "Historique de vente",
              date_time_format: new Intl.DateTimeFormat("fr-CA", {
                minute: "2-digit",
                hour: "2-digit",
                day: "numeric",
                month: "long",
                year: "numeric",
              }),
            },
            change_price: {
              changed_price: (name, price) =>
                `Changé le prix de <strong>${name}</strong> pour <strong class="price-item">${price}</strong> <span class="maana-icon" alt="maanas"></span>.`,
              invalid_price: "Ce prix n'est pas valide.",
              save: "Sauvegarder",
              text: "Combien de maanas souhaites-tu offrir pour acquérir cet item?",
              title: "Changer le prix",
            },
            wishlist: {
              assistance: `Sur cette page, tu peux organiser ta liste de souhaits et vérifier le statut de tes articles souhaités. Prends note que ta liste de souhaits est sauvegardée localement dans les paramètres d'<strong>${GM.info.script.name}</strong> et n'est pas envoyée aux serveurs d'Eldarya. Pour transférer ta liste de souhaits vers un autre navigateur, exporte-la à partir de la page <a href="/user/account" style="text-decoration: underline;">mon&nbsp;compte</a>.`,
              actions: "Actions",
              change_price: "Changer le prix",
              delete_tooltip: "Retirer de la liste de souhaits",
              delete: "Supprimer",
              icon: "Icône",
              name: "Nom",
              price: "Prix",
              reset_tooltip: "Réinitialiser l'état d'erreur",
              reset: "Réinitialiser",
              status: "Statut",
              title: "Liste de souhaits",
            },
          },
          account: {
            debug_tooltip: "Active ou désactive la journalisation.",
            debug: "Débogage",
            enhancements: "Améliorations",
            explorations: "Explorations",
            export: "Exporter les paramètres",
            import: "Importer les paramètres",
            imported: "Paramètres importés",
            market: "Marché",
            minigames: "Mini-jeux",
          },
          pet: {
            auto_explore: "Marquer",
            date_time_format: new Intl.DateTimeFormat("fr-CA", {
              minute: "2-digit",
              hour: "2-digit",
              day: "numeric",
              month: "long",
              year: "numeric",
            }),
            delete_history: "Nettoyer l'historique",
            empty_history:
              "Ton historique d'exploration est vide. Il se remplira automatiquement à mesure que ton familier trouvera des items en exploration.",
            goto_account:
              "Pour transférer ton historique d'explorations vers un autre navigateur, exporte tes paramètres à partir de la page <em>mon compte</em>.",
            history: "Historique",
            saved_locally: `Prends note que ton historique d'explorations est sauvegardé localement dans les paramètres d'<strong>${GM.info.script.name}</strong> et n'a pas été envoyé aux serveurs d'Eldarya.`,
          },
          profile: {
            export_outfit: "Exporter la tenue",
            download_outfit: "Télécharger le PNG",
          },
          error: {
            downloadCanvas:
              "Une erreur est survenue lors du téléchargement de l'image.",
          },
          mall: {
            add_to_wishlist: {
              title: "Ajouter à la liste de souhait du marché",
              text: "Combien de maanas souhaites-tu offrir pour acquérir cet item?",
              note: "Prends note que les items ajoutés à partir de la boutique ne seront pas nécessairement disponibles au marché.",
            },
          },
        }
        Object.freeze(fr)

        /***/
      },

    /***/ "./src/i18n/translate.ts":
      /*!*******************************!*\
  !*** ./src/i18n/translate.ts ***!
  \*******************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ translate: () => /* binding */ translate,
          /* harmony export */
        })
        /* harmony import */ var _en__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(/*! ./en */ "./src/i18n/en.ts")
        /* harmony import */ var _fr__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(/*! ./fr */ "./src/i18n/fr.ts")

        function translation() {
          if (location.hostname.endsWith(".com.br"))
            return _en__WEBPACK_IMPORTED_MODULE_0__.en
          if (location.hostname.endsWith(".de"))
            return _en__WEBPACK_IMPORTED_MODULE_0__.en
          if (location.hostname.endsWith(".es"))
            return _en__WEBPACK_IMPORTED_MODULE_0__.en
          if (location.hostname.endsWith(".hu"))
            return _en__WEBPACK_IMPORTED_MODULE_0__.en
          if (location.hostname.endsWith(".it"))
            return _en__WEBPACK_IMPORTED_MODULE_0__.en
          if (location.hostname.endsWith(".pl"))
            return _en__WEBPACK_IMPORTED_MODULE_0__.en
          if (location.hostname.endsWith(".ru"))
            return _en__WEBPACK_IMPORTED_MODULE_0__.en
          if (location.hostname.endsWith(".com"))
            return _en__WEBPACK_IMPORTED_MODULE_0__.en
          if (location.hostname.endsWith(".fr"))
            return _fr__WEBPACK_IMPORTED_MODULE_1__.fr
          else return _en__WEBPACK_IMPORTED_MODULE_0__.en
        }
        const translate = translation()

        /***/
      },

    /***/ "./src/indexed_db/databases.enum.ts":
      /*!******************************************!*\
  !*** ./src/indexed_db/databases.enum.ts ***!
  \******************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ Databases: () => /* binding */ Databases,
          /* harmony export */
        })
        var Databases
        ;(function (Databases) {
          Databases["eldarya_enhancements"] = "eldarya_enhancements"
        })(Databases || (Databases = {}))

        /***/
      },

    /***/ "./src/indexed_db/fields.enum.ts":
      /*!***************************************!*\
  !*** ./src/indexed_db/fields.enum.ts ***!
  \***************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ Fields: () => /* binding */ Fields,
          /* harmony export */
        })
        var Fields
        ;(function (Fields) {
          Fields["blob"] = "blob"
          Fields["id"] = "id"
          Fields["items"] = "items"
          Fields["name"] = "name"
        })(Fields || (Fields = {}))

        /***/
      },

    /***/ "./src/indexed_db/indexed_db.ts":
      /*!**************************************!*\
  !*** ./src/indexed_db/indexed_db.ts ***!
  \**************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
          /* harmony export */
        })
        /* harmony import */ var _databases_enum__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ./databases.enum */ "./src/indexed_db/databases.enum.ts"
          )
        /* harmony import */ var _fields_enum__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ./fields.enum */ "./src/indexed_db/fields.enum.ts"
          )
        /* harmony import */ var _tables_enum__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(
            /*! ./tables.enum */ "./src/indexed_db/tables.enum.ts"
          )

        class IndexedDB {
          db
          constructor() {
            const request = indexedDB.open(
              _databases_enum__WEBPACK_IMPORTED_MODULE_0__.Databases
                .eldarya_enhancements,
              1
            )
            request.onsuccess = () => (this.db = request.result)
            request.onupgradeneeded = function () {
              const db = this.result
              const objectStore = db.createObjectStore(
                _tables_enum__WEBPACK_IMPORTED_MODULE_2__.Tables
                  .favourite_outfits,
                {
                  keyPath: "id",
                  autoIncrement: true,
                }
              )
              objectStore.createIndex(
                _fields_enum__WEBPACK_IMPORTED_MODULE_1__.Fields.blob,
                "blob",
                { unique: false }
              )
              objectStore.createIndex(
                _fields_enum__WEBPACK_IMPORTED_MODULE_1__.Fields.items,
                "items",
                { unique: false }
              )
              objectStore.createIndex(
                _fields_enum__WEBPACK_IMPORTED_MODULE_1__.Fields.name,
                "name",
                { unique: false }
              )
            }
          }
          /** @returns a new `FavouriteOutfit` with the `key` property set. */
          async addFavouriteOutfit(favourite) {
            return new Promise((resolve, reject) => {
              if (!this.db) return void reject()
              const request = this.db
                .transaction(
                  [
                    _tables_enum__WEBPACK_IMPORTED_MODULE_2__.Tables
                      .favourite_outfits,
                  ],
                  "readwrite"
                )
                .objectStore(
                  _tables_enum__WEBPACK_IMPORTED_MODULE_2__.Tables
                    .favourite_outfits
                )
                .add(favourite)
              request.onsuccess = () =>
                resolve({
                  ...favourite,
                  url: favourite.url ?? URL.createObjectURL(favourite.blob),
                  id: Number(request.result),
                })
            })
          }
          async clearFavouriteOutfits() {
            return new Promise((resolve, reject) => {
              if (!this.db) return void reject()
              const request = this.db
                .transaction(
                  [
                    _tables_enum__WEBPACK_IMPORTED_MODULE_2__.Tables
                      .favourite_outfits,
                  ],
                  "readwrite"
                )
                .objectStore(
                  _tables_enum__WEBPACK_IMPORTED_MODULE_2__.Tables
                    .favourite_outfits
                )
                .clear()
              request.onsuccess = () => resolve()
            })
          }
          async deleteFavouriteOutfit(favourite) {
            return new Promise((resolve, reject) => {
              if (!this.db) return void reject()
              const request = this.db
                .transaction(
                  [
                    _tables_enum__WEBPACK_IMPORTED_MODULE_2__.Tables
                      .favourite_outfits,
                  ],
                  "readwrite"
                )
                .objectStore(
                  _tables_enum__WEBPACK_IMPORTED_MODULE_2__.Tables
                    .favourite_outfits
                )
                .delete(favourite.id)
              request.onsuccess = () => {
                resolve()
                if (favourite.url) URL.revokeObjectURL(favourite.url)
              }
            })
          }
          async getFavouriteOutfit(id) {
            return new Promise((resolve, reject) => {
              if (!this.db) return void reject()
              const request = this.db
                .transaction(
                  [
                    _tables_enum__WEBPACK_IMPORTED_MODULE_2__.Tables
                      .favourite_outfits,
                  ],
                  "readonly"
                )
                .objectStore(
                  _tables_enum__WEBPACK_IMPORTED_MODULE_2__.Tables
                    .favourite_outfits
                )
                .get(id)
              const favourite = request.result
              request.onsuccess = () =>
                resolve({
                  ...favourite,
                  url: URL.createObjectURL(favourite.blob),
                })
            })
          }
          async getFavouriteOutfits() {
            return new Promise((resolve, reject) => {
              if (!this.db) return void reject()
              const request = this.db
                .transaction(
                  [
                    _tables_enum__WEBPACK_IMPORTED_MODULE_2__.Tables
                      .favourite_outfits,
                  ],
                  "readonly"
                )
                .objectStore(
                  _tables_enum__WEBPACK_IMPORTED_MODULE_2__.Tables
                    .favourite_outfits
                )
                .getAll()
              request.onsuccess = () =>
                resolve(
                  request.result.map(favourite => ({
                    ...favourite,
                    url: URL.createObjectURL(favourite.blob),
                  }))
                )
            })
          }
        }
        /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ =
          new IndexedDB()

        /***/
      },

    /***/ "./src/indexed_db/tables.enum.ts":
      /*!***************************************!*\
  !*** ./src/indexed_db/tables.enum.ts ***!
  \***************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ Tables: () => /* binding */ Tables,
          /* harmony export */
        })
        var Tables
        ;(function (Tables) {
          Tables["favourite_outfits"] = "favourite_outfits"
        })(Tables || (Tables = {}))

        /***/
      },

    /***/ "./src/local_storage/local_storage.enum.ts":
      /*!*************************************************!*\
  !*** ./src/local_storage/local_storage.enum.ts ***!
  \*************************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ LocalStorageKey: () =>
            /* binding */ LocalStorageKey,
          /* harmony export */
        })
        var LocalStorageKey
        ;(function (LocalStorageKey) {
          LocalStorageKey["autoExploreLocations"] = "autoExploreLocations"
          LocalStorageKey["debug"] = "debug"
          LocalStorageKey["explorationHistory"] = "explorationHistory"
          LocalStorageKey["explorations"] = "explorations"
          LocalStorageKey["market"] = "market"
          LocalStorageKey["meta"] = "meta"
          LocalStorageKey["minigames"] = "minigames"
          LocalStorageKey["purchases"] = "purchases"
          LocalStorageKey["sales"] = "sales"
          LocalStorageKey["unlocked"] = "unlocked"
          LocalStorageKey["version"] = "version"
          LocalStorageKey["wishlist"] = "wishlist"
        })(LocalStorageKey || (LocalStorageKey = {}))

        /***/
      },

    /***/ "./src/local_storage/local_storage.ts":
      /*!********************************************!*\
  !*** ./src/local_storage/local_storage.ts ***!
  \********************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ LocalStorage: () => /* binding */ LocalStorage,
          /* harmony export */
        })
        /* harmony import */ var blob_util__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! blob-util */ "./node_modules/.pnpm/blob-util@2.0.2/node_modules/blob-util/dist/blob-util.es.js"
          )
        /* harmony import */ var _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../indexed_db/indexed_db */ "./src/indexed_db/indexed_db.ts"
          )
        /* harmony import */ var _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(
            /*! ./local_storage.enum */ "./src/local_storage/local_storage.enum.ts"
          )

        class LocalStorage {
          static localStorage = localStorage
          constructor() {}
          static get autoExploreLocations() {
            return this.getItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .autoExploreLocations,
              []
            )
          }
          static set autoExploreLocations(locations) {
            this.setItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .autoExploreLocations,
              locations
            )
          }
          static get debug() {
            return this.getItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .debug,
              false
            )
          }
          static set debug(enabled) {
            this.setItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .debug,
              enabled
            )
          }
          static get explorationHistory() {
            return this.getItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .explorationHistory,
              []
            )
          }
          static set explorationHistory(explorationHistory) {
            this.setItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .explorationHistory,
              explorationHistory
            )
          }
          static get explorations() {
            return this.getItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .explorations,
              false
            )
          }
          static set explorations(enabled) {
            this.setItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .explorations,
              enabled
            )
          }
          static get market() {
            return this.getItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .market,
              false
            )
          }
          static set market(enabled) {
            this.setItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .market,
              enabled
            )
          }
          static get meta() {
            return this.getItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .meta,
              null
            )
          }
          static set meta(meta) {
            this.setItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .meta,
              meta
            )
          }
          static get minigames() {
            return this.getItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .minigames,
              false
            )
          }
          static set minigames(enabled) {
            this.setItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .minigames,
              enabled
            )
          }
          static get purchases() {
            return this.getItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .purchases,
              []
            )
          }
          static set purchases(entry) {
            this.setItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .purchases,
              entry
            )
          }
          static get sales() {
            return this.getItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .sales,
              []
            )
          }
          static set sales(sale) {
            this.setItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .sales,
              sale
            )
          }
          static get unlocked() {
            return this.getItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .unlocked,
              false
            )
          }
          static set unlocked(unlocked) {
            this.setItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .unlocked,
              unlocked
            )
          }
          static get version() {
            return this.getItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .version,
              ""
            )
          }
          static set version(version) {
            this.setItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .version,
              version
            )
          }
          static get wishlist() {
            return this.getItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .wishlist,
              []
            )
          }
          static set wishlist(locations) {
            this.setItem(
              _local_storage_enum__WEBPACK_IMPORTED_MODULE_2__.LocalStorageKey
                .wishlist,
              locations
            )
          }
          static async getSettings() {
            return {
              autoExploreLocations: this.autoExploreLocations,
              debug: this.debug,
              explorationHistory: this.explorationHistory,
              explorations: this.explorations,
              favourites: await Promise.all(
                (
                  await _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__[
                    "default"
                  ].getFavouriteOutfits()
                ).map(async favourite => ({
                  name: favourite.name,
                  items: favourite.items,
                  base64: await (0,
                  blob_util__WEBPACK_IMPORTED_MODULE_0__.blobToBase64String)(
                    favourite.blob
                  ),
                }))
              ),
              market: this.market,
              minigames: this.minigames,
              unlocked: this.unlocked,
              version: this.version,
              wishlist: this.wishlist,
            }
          }
          static async setSettings(settings) {
            this.autoExploreLocations = settings.autoExploreLocations
            this.debug = settings.debug
            this.explorationHistory = settings.explorationHistory
            this.explorations = settings.explorations
            this.market = settings.market
            this.minigames = settings.minigames
            this.unlocked = settings.unlocked
            this.version = settings.version
            this.wishlist = settings.wishlist
            await _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__[
              "default"
            ].clearFavouriteOutfits()
            for (const favourite of settings.favourites.map(favourite => ({
              blob: (0,
              blob_util__WEBPACK_IMPORTED_MODULE_0__.base64StringToBlob)(
                favourite.base64
              ),
              items: favourite.items,
              name: favourite.name,
            }))) {
              void _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_1__[
                "default"
              ].addFavouriteOutfit(favourite)
            }
          }
          static getItem(key, fallback) {
            return (
              JSON.parse(
                this.localStorage.getItem(key) ?? JSON.stringify(fallback)
              ) ?? fallback
            )
          }
          static setItem(key, value) {
            this.localStorage.setItem(key, JSON.stringify(value))
          }
        }

        /***/
      },

    /***/ "./src/marketplace/enums/body_location.enum.ts":
      /*!*****************************************************!*\
  !*** ./src/marketplace/enums/body_location.enum.ts ***!
  \*****************************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ BodyLocation: () => /* binding */ BodyLocation,
          /* harmony export */
        })
        var BodyLocation
        ;(function (BodyLocation) {
          BodyLocation["All"] = ""
          BodyLocation[(BodyLocation["Underwear"] = 1)] = "Underwear"
          BodyLocation[(BodyLocation["Skins"] = 2)] = "Skins"
          BodyLocation[(BodyLocation["Tattoos"] = 20)] = "Tattoos"
          BodyLocation[(BodyLocation["Mouths"] = 21)] = "Mouths"
          BodyLocation[(BodyLocation["Eyes"] = 3)] = "Eyes"
          BodyLocation[(BodyLocation["Hair"] = 4)] = "Hair"
          BodyLocation[(BodyLocation["Socks"] = 5)] = "Socks"
          BodyLocation[(BodyLocation["Shoes"] = 6)] = "Shoes"
          BodyLocation[(BodyLocation["Pants"] = 7)] = "Pants"
          BodyLocation[(BodyLocation["HandAccessories"] = 8)] =
            "HandAccessories"
          BodyLocation[(BodyLocation["Tops"] = 9)] = "Tops"
          BodyLocation[(BodyLocation["Coats"] = 10)] = "Coats"
          BodyLocation[(BodyLocation["Gloves"] = 11)] = "Gloves"
          BodyLocation[(BodyLocation["Necklaces"] = 12)] = "Necklaces"
          BodyLocation[(BodyLocation["Dresses"] = 13)] = "Dresses"
          BodyLocation[(BodyLocation["Hats"] = 14)] = "Hats"
          BodyLocation[(BodyLocation["FaceAccessories"] = 15)] =
            "FaceAccessories"
          BodyLocation[(BodyLocation["Funds"] = 16)] = "Funds"
          BodyLocation[(BodyLocation["Belts"] = 18)] = "Belts"
          BodyLocation[(BodyLocation["Atmospheres"] = 19)] = "Atmospheres"
        })(BodyLocation || (BodyLocation = {}))

        /***/
      },

    /***/ "./src/marketplace/enums/category.enum.ts":
      /*!************************************************!*\
  !*** ./src/marketplace/enums/category.enum.ts ***!
  \************************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ CategoryString: () =>
            /* binding */ CategoryString,
          /* harmony export */ CategoryNumber: () =>
            /* binding */ CategoryNumber,
          /* harmony export */
        })
        var CategoryString
        ;(function (CategoryString) {
          CategoryString["all"] = ""
          CategoryString["food"] = "food"
          CategoryString["alchemy"] = "alchemy"
          CategoryString["utility"] = "utility"
          CategoryString["tame"] = "tame"
        })(CategoryString || (CategoryString = {}))
        var CategoryNumber
        ;(function (CategoryNumber) {
          CategoryNumber["all"] = ""
          CategoryNumber[(CategoryNumber["food"] = 1)] = "food"
          CategoryNumber["alchemy"] = "Consumable"
          CategoryNumber[(CategoryNumber["utility"] = 3)] = "utility"
          CategoryNumber[(CategoryNumber["tame"] = 4)] = "tame"
        })(CategoryNumber || (CategoryNumber = {}))

        /***/
      },

    /***/ "./src/marketplace/enums/guard.enum.ts":
      /*!*********************************************!*\
  !*** ./src/marketplace/enums/guard.enum.ts ***!
  \*********************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ Guard: () => /* binding */ Guard,
          /* harmony export */
        })
        var Guard
        ;(function (Guard) {
          Guard["any"] = ""
          Guard[(Guard["light"] = 1)] = "light"
          Guard[(Guard["obsidian"] = 2)] = "obsidian"
          Guard[(Guard["absynthe"] = 3)] = "absynthe"
          Guard[(Guard["shadow"] = 4)] = "shadow"
        })(Guard || (Guard = {}))

        /***/
      },

    /***/ "./src/marketplace/enums/rarity.enum.ts":
      /*!**********************************************!*\
  !*** ./src/marketplace/enums/rarity.enum.ts ***!
  \**********************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ Rarity: () => /* binding */ Rarity,
          /* harmony export */
        })
        var Rarity
        ;(function (Rarity) {
          Rarity["all"] = ""
          Rarity["common"] = "common"
          Rarity["rare"] = "rare"
          Rarity["epic"] = "epic"
          Rarity["legendary"] = "legendary"
          Rarity["event"] = "event"
        })(Rarity || (Rarity = {}))

        /***/
      },

    /***/ "./src/marketplace/enums/type.enum.ts":
      /*!********************************************!*\
  !*** ./src/marketplace/enums/type.enum.ts ***!
  \********************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ Type: () => /* binding */ Type,
          /* harmony export */
        })
        var Type
        ;(function (Type) {
          Type["All"] = ""
          Type["Bag"] = "Bag"
          Type["Consumable"] = "Consumable"
          Type["EggItem"] = "EggItem"
          Type["PlayerWearableItem"] = "PlayerWearableItem"
          Type["QuestItem"] = "QuestItem"
        })(Type || (Type = {}))

        /***/
      },

    /***/ "./src/marketplace/marketplace_handlers.ts":
      /*!*************************************************!*\
  !*** ./src/marketplace/marketplace_handlers.ts ***!
  \*************************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ getItemDetails: () =>
            /* binding */ getItemDetails,
          /* harmony export */
        })
        /* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(/*! ../console */ "./src/console.ts")
        /* harmony import */ var _eldarya_util__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(/*! ../eldarya_util */ "./src/eldarya_util.ts")
        /* harmony import */ var _enums_rarity_enum__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(
            /*! ./enums/rarity.enum */ "./src/marketplace/enums/rarity.enum.ts"
          )

        function getItemDetails(li) {
          const dataset = li.dataset
          const name = li.querySelector(".abstract-name")?.innerText
          const abstractType = li.querySelector(".abstract-type")?.innerText
          const src = li.querySelector(".abstract-icon img")?.src
          const rarity =
            _enums_rarity_enum__WEBPACK_IMPORTED_MODULE_2__.Rarity[
              li
                .querySelector(
                  ".rarity-marker-common, .rarity-marker-rare, .rarity-marker-epic, .rarity-marker-legendary, .rarity-marker-event"
                )
                ?.className.split("rarity-marker-")[1] ?? ""
            ]
          const currentPrice = li.querySelector(
            ".price-item[data-bids]"
          )?.dataset
          const buyNowPrice = li.querySelector(
            ".price-item:not([data-bids])"
          )?.dataset
          if (!src || !name) {
            _console__WEBPACK_IMPORTED_MODULE_0__.Console.warn(
              "Incomplete market entry",
              li
            )
            return null
          }
          return {
            ...dataset,
            icon: (0, _eldarya_util__WEBPACK_IMPORTED_MODULE_1__.trimIcon)(src),
            rarity,
            name,
            abstractType,
            buyNowPrice,
            currentPrice,
            date: new Date(),
          }
        }

        /***/
      },

    /***/ "./src/math_util.ts":
      /*!**************************!*\
  !*** ./src/math_util.ts ***!
  \**************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ MathUtil: () => /* binding */ MathUtil,
          /* harmony export */
        })
        class MathUtil {
          static phi = (1 + Math.sqrt(5)) / 2
          static randomBetween(min, max) {
            return Math.random() * (max - min) + min
          }
        }

        /***/
      },

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

        function migrate() {
          switch (
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__
              .LocalStorage.version
          ) {
            case GM.info.script.version:
              return
            case "":
              installed()
              break
            default:
              switch (GM.info.script.version) {
                case "1.2.0":
                  v1_2_0()
                  break
                case "1.2.9":
                  v1_2_9()
                  break
                case "1.2.10":
                  v1_2_10()
                  break
                case "1.2.13":
                  v1_2_13()
                  break
                default:
                  installed()
                  break
              }
          }
          _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.version =
            GM.info.script.version
        }
        function installed() {
          $.flavrNotif(`${name()} ${version()} installed!`)
        }
        function name() {
          return `<strong>${GM.info.script.name}</strong>`
        }
        function version() {
          return `v<strong>${GM.info.script.version}</strong>`
        }
        function v1_2_0() {
          _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__.LocalStorage.sales =
            []
          $.flavrNotif(
            `Updated to ${version()}. Your sales history was erased.`
          )
        }
        function v1_2_9() {
          $.flavrNotif(
            `Updated to ${version()}. The wishlist has been improved to sort by category/type/name, but your wished items do not have a type. You can add types by re-adding the items via the market.`
          )
        }
        function v1_2_10() {
          $.flavrNotif(
            `Updated to ${version()}. The wishlist has been improved to sort by category/type/rarity/name, but your wished items do not have a rarity. You can add rarities by re-adding the items via the market.`
          )
        }
        function v1_2_13() {
          $.flavrNotif(
            `Updated to ${version()}. The enhanced dressing experience was disabled.`
          )
        }

        /***/
      },

    /***/ "./src/minigames/emile.ts":
      /*!********************************!*\
  !*** ./src/minigames/emile.ts ***!
  \********************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ playPeggle: () => /* binding */ playPeggle,
          /* harmony export */ playFlappy: () => /* binding */ playFlappy,
          /* harmony export */ playHatchlings: () =>
            /* binding */ playHatchlings,
          /* harmony export */
        })
        /* harmony import */ var _eldarya_jquery__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../eldarya/jquery */ "./src/eldarya/jquery.ts"
          )
        /* harmony import */ var _eldarya_jquery__WEBPACK_IMPORTED_MODULE_0___default =
          /*#__PURE__*/ __webpack_require__.n(
            _eldarya_jquery__WEBPACK_IMPORTED_MODULE_0__
          )
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _flappy__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(/*! ./flappy */ "./src/minigames/flappy.ts")
        /* harmony import */ var _hatchlings__WEBPACK_IMPORTED_MODULE_3__ =
          __webpack_require__(
            /*! ./hatchlings */ "./src/minigames/hatchlings.ts"
          )
        /* harmony import */ var _peggle__WEBPACK_IMPORTED_MODULE_4__ =
          __webpack_require__(/*! ./peggle */ "./src/minigames/peggle.ts")

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

        /***/
      },

    /***/ "./src/minigames/flappy.ts":
      /*!*********************************!*\
  !*** ./src/minigames/flappy.ts ***!
  \*********************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ flappy: () => /* binding */ flappy,
          /* harmony export */
        })
        const flappy = {
          name: "Flappy",
          scoreMin: 180,
          scoreMax: 200,
          delayMin: 60_000,
          delayMax: 70_000,
          buttonSelector:
            '.minigame-start [href="/minigames/bubbltemple"] .nl-button',
          icon: "/static/img/new-layout/minigames/icon_bubbletemple.png",
        }

        /***/
      },

    /***/ "./src/minigames/hatchlings.ts":
      /*!*************************************!*\
  !*** ./src/minigames/hatchlings.ts ***!
  \*************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ hatchlings: () => /* binding */ hatchlings,
          /* harmony export */
        })
        const hatchlings = {
          name: "Hatchlings",
          scoreMin: 18,
          scoreMax: 20,
          delayMin: 30_000,
          delayMax: 30_000,
          buttonSelector:
            '.minigame-start [href="/minigames/cocooninpick"] .nl-button',
          icon: "/static/img/new-layout/minigames/icon_coconinpick.png",
        }

        /***/
      },

    /***/ "./src/minigames/peggle.ts":
      /*!*********************************!*\
  !*** ./src/minigames/peggle.ts ***!
  \*********************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ peggle: () => /* binding */ peggle,
          /* harmony export */
        })
        const peggle = {
          name: "Peggle",
          scoreMin: 9,
          scoreMax: 10,
          delayMin: 10_000,
          delayMax: 20_000,
          buttonSelector:
            '.minigame-start [href="/minigames/gembomb"] .nl-button',
          icon: "/static/img/new-layout/minigames/icon_gembomb.png",
        }

        /***/
      },

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

        /***/
      },

    /***/ "./src/pet/exploration-history.ts":
      /*!****************************************!*\
  !*** ./src/pet/exploration-history.ts ***!
  \****************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadExplorationHistory: () =>
            /* binding */ loadExplorationHistory,
          /* harmony export */
        })
        /* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(/*! ../console */ "./src/console.ts")
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(
            /*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts"
          )
        /* harmony import */ var _exploration_watcher__WEBPACK_IMPORTED_MODULE_3__ =
          __webpack_require__(
            /*! ./exploration-watcher */ "./src/pet/exploration-watcher.ts"
          )

        function loadExplorationHistory() {
          loadHistoryButton()
          ;(0,
          _exploration_watcher__WEBPACK_IMPORTED_MODULE_3__.listenTreasureHunt)()
        }
        function loadHistoryButton() {
          const closeExplorationButton = document.querySelector(
            "#close-treasure-hunt-interface"
          )
          if (!closeExplorationButton)
            return void _console__WEBPACK_IMPORTED_MODULE_0__.Console.error(
              "Couldn't find #close-treasure-hunt-interface."
            )
          closeExplorationButton.style.display = "inline-block"
          closeExplorationButton.style.position = "relative"
          closeExplorationButton.style.right = "0"
          closeExplorationButton.style.top = "0"
          closeExplorationButton.addEventListener("click", onClickPet)
          const historyButton = document.createElement("a")
          historyButton.classList.add("nl-button", "nl-button-back")
          historyButton.style.marginRight = "0.6em"
          historyButton.textContent =
            _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.pet.history
          historyButton.addEventListener("click", onClickHistory)
          const row = document.createElement("div")
          row.insertAdjacentElement("beforeend", historyButton)
          row.insertAdjacentElement("beforeend", closeExplorationButton)
          document
            .querySelector("#right-container-inner")
            ?.insertAdjacentElement("afterbegin", row)
        }
        function onClickHistory() {
          hidePet()
          hideExploration()
          makeHistory()
          showHistory()
        }
        function onClickPet() {
          hideHistory()
          showPet()
        }
        function hidePet() {
          const nameContainer = document.getElementById("name-container")
          const infoContainer = document.getElementById("infos-container")
          const petImageContainer = document.getElementById(
            "pet-image-container"
          )
          if (!nameContainer || !infoContainer || !petImageContainer)
            return void _console__WEBPACK_IMPORTED_MODULE_0__.Console.error(
              "The pet display was damaged.",
              {
                nameContainer,
                infoContainer,
                petImageContainer,
              }
            )
          nameContainer.style.display = "none"
          infoContainer.style.display = "none"
          petImageContainer.style.display = "none"
        }
        function showPet() {
          const nameContainer = document.getElementById("name-container")
          const infoContainer = document.getElementById("infos-container")
          const petImageContainer = document.getElementById(
            "pet-image-container"
          )
          if (!nameContainer || !infoContainer || !petImageContainer)
            return void _console__WEBPACK_IMPORTED_MODULE_0__.Console.error(
              "The pet display was damaged.",
              {
                nameContainer,
                infoContainer,
                petImageContainer,
              }
            )
          nameContainer.style.display = ""
          infoContainer.style.display = ""
          petImageContainer.style.display = ""
        }
        function showHistory() {
          const history = document.getElementById("history-container")
          if (!history) return
          history.style.display = ""
        }
        function hideHistory() {
          const history = document.getElementById("history-container")
          if (!history) return
          history.style.display = "none"
        }
        function hideExploration() {
          document
            .getElementById("main-section")
            ?.classList.remove("treasure-hunt-interface-open")
        }
        function makeHistory() {
          document.getElementById("history-container")?.remove()
          const template = __webpack_require__(
            /*! ../templates/html/exploration_history.html */ "./src/templates/html/exploration_history.html"
          )
          document.getElementById("left-container")?.insertAdjacentHTML(
            "beforeend",
            template.render({
              translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate,
              history:
                _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.explorationHistory.map(
                  history => ({
                    ...history,
                    date: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.pet.date_time_format.format(
                      new Date(history.date)
                    ),
                  })
                ),
            })
          )
          document
            .getElementById("delete-history")
            ?.addEventListener("click", () => {
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.explorationHistory =
                []
              makeHistory()
            })
        }

        /***/
      },

    /***/ "./src/pet/exploration-watcher.ts":
      /*!****************************************!*\
  !*** ./src/pet/exploration-watcher.ts ***!
  \****************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ listenTreasureHunt: () =>
            /* binding */ listenTreasureHunt,
          /* harmony export */
        })
        /* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(/*! ../console */ "./src/console.ts")
        /* harmony import */ var _eldarya_util__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(/*! ../eldarya_util */ "./src/eldarya_util.ts")
        /* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(
            /*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts"
          )

        function listenTreasureHunt() {
          const resultOverlay = document.querySelector(
            "#treasure-hunt-result-overlay"
          )
          if (!resultOverlay)
            return void _console__WEBPACK_IMPORTED_MODULE_0__.Console.error(
              "There is no result overlay.",
              resultOverlay
            )
          new MutationObserver(() => {
            _console__WEBPACK_IMPORTED_MODULE_0__.Console.log(
              "Mutation in",
              resultOverlay
            )
            if (!resultOverlay.classList.contains("active")) return
            const results = getResults()
            if (results.length === 0) return
            _console__WEBPACK_IMPORTED_MODULE_0__.Console.log(
              "Results:",
              results
            )
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.explorationHistory =
              [
                ...results,
                ..._local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__
                  .LocalStorage.explorationHistory,
              ]
          }).observe(resultOverlay, {
            attributeFilter: ["class"],
          })
        }
        function getResults() {
          const locationName = document
            .querySelector("#th-again strong")
            ?.textContent?.trim()
          const now = new Date()
          return Array.from(document.querySelectorAll(".th-result")).map(
            result => {
              const img = result.querySelector("img.th-result-img")
              return {
                count: result
                  .querySelector(".resource-count")
                  ?.textContent?.trim(),
                date: now,
                icon: img
                  ? (0, _eldarya_util__WEBPACK_IMPORTED_MODULE_1__.trimIcon)(
                      img.src
                    )
                  : undefined,
                locationName,
                name: result
                  .querySelector(".tooltip-content h3")
                  ?.textContent?.trim(),
                tradable: Boolean(result.querySelector(".tradable")),
              }
            }
          )
        }

        /***/
      },

    /***/ "./src/pet/exploration.ts":
      /*!********************************!*\
  !*** ./src/pet/exploration.ts ***!
  \********************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadMarkers: () => /* binding */ loadMarkers,
          /* harmony export */
        })
        /* harmony import */ var _ajax_change_region__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../ajax/change_region */ "./src/ajax/change_region.ts"
          )
        /* harmony import */ var _api_result_enum__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../api/result.enum */ "./src/api/result.enum.ts"
          )
        /* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(/*! ../console */ "./src/console.ts")
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_3__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__ =
          __webpack_require__(
            /*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts"
          )

        function loadMarkers() {
          const autoExploreLocations =
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__
              .LocalStorage.autoExploreLocations
          for (const div of document.querySelectorAll(
            ".map-location[data-id]"
          )) {
            const locationId = Number(div.getAttribute("data-id"))
            if (!locationId) continue
            loadPictoMap(autoExploreLocations, div)
            div.addEventListener("click", () =>
              new MutationObserver((_, observer) => {
                addAutoExploreButton(locationId, observer)
              }).observe(document.getElementById("map-location-preview"), {
                attributes: true,
              })
            )
          }
        }
        function addAutoExploreButton(locationId, observer) {
          const buttonsContainer = document.querySelector("#buttons-container")
          if (!buttonsContainer) return
          observer?.disconnect()
          // Parameters to be injected into the template
          const context = {
            locationId,
            active:
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.autoExploreLocations.some(
                saved => saved.location.id === locationId
              ),
            regionId: Number(
              document
                .querySelector(".minimap.current[data-mapid]")
                ?.getAttribute("data-mapid")
            ),
          }
          // Add the auto explore button
          buttonsContainer.querySelector("#auto-explore-button")?.remove()
          const autoExploreTemplate = __webpack_require__(
            /*! ../templates/html/auto_explore_button.html */ "./src/templates/html/auto_explore_button.html"
          )
          buttonsContainer.insertAdjacentHTML(
            "beforeend",
            autoExploreTemplate.render({
              ...context,
              translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_3__.translate,
            })
          )
          // Bind `autoExplore` and `loadPictoMaps`
          buttonsContainer
            .querySelector("#auto-explore-button")
            ?.addEventListener("click", () => {
              _console__WEBPACK_IMPORTED_MODULE_2__.Console.debug(
                "Clicked on #auto-explore-button.",
                context
              )
              void markLocation(context).then(loadPictoMaps)
            })
          void disableExplore(context)
        }
        async function disableExplore(context) {
          const entry = await getAutoExploreEntry(
            context.regionId,
            context.locationId
          )
          if (!entry) return
          if (petEnergy < Number(entry.location.energyRequired))
            document.getElementById("explore-button")?.classList.add("disabled")
        }
        async function markLocation(context) {
          if (context.active) {
            const filteredLocations =
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.autoExploreLocations.filter(
                saved => saved.location.id !== context.locationId
              )
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.autoExploreLocations =
              filteredLocations
            addAutoExploreButton(context.locationId)
            return
          }
          const newAutoExplore = await getAutoExploreEntry(
            context.regionId,
            context.locationId
          )
          if (!newAutoExplore) {
            _console__WEBPACK_IMPORTED_MODULE_2__.Console.error(
              `Could not generate an auto explore entry for location #${context.locationId}.`,
              context
            )
            return
          }
          const newLocations =
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__
              .LocalStorage.autoExploreLocations
          newLocations.push(newAutoExplore)
          _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.autoExploreLocations =
            newLocations
          addAutoExploreButton(context.locationId)
        }
        async function getAutoExploreEntry(regionId, locationId) {
          const region = await getRegion(regionId)
          if (!region) {
            _console__WEBPACK_IMPORTED_MODULE_2__.Console.error(
              `Could not get region #${regionId}.`
            )
            return null
          }
          const location = region.locations.find(
            location => location.id === locationId
          )
          if (!location) {
            _console__WEBPACK_IMPORTED_MODULE_2__.Console.error(
              `Could not get location #${locationId} in ${region.name}.`,
              region
            )
            return null
          }
          return {
            location,
            region,
          }
        }
        async function getRegion(id) {
          if (id.toString() === currentRegion.id) return currentRegion
          const json = await (0,
          _ajax_change_region__WEBPACK_IMPORTED_MODULE_0__.changeRegion)(id)
          if (
            json.result ===
            _api_result_enum__WEBPACK_IMPORTED_MODULE_1__.Result.success
          )
            return json.data.currentRegion
          return null
        }
        // Picto map
        function loadPictoMaps() {
          const autoExploreLocations =
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__
              .LocalStorage.autoExploreLocations
          for (const div of document.querySelectorAll(
            ".map-location[data-id]"
          )) {
            loadPictoMap(autoExploreLocations, div)
          }
        }
        function loadPictoMap(autoExploreLocations, div) {
          const mapLocation = div.getAttribute("data-id")
          if (!mapLocation) return
          div.style.backgroundImage = autoExploreLocations.some(
            saved => saved.location.id === Number(mapLocation)
          )
            ? "url(/static/img/new-layout/pet/icons/picto_map_explo.png)"
            : "url(/static/img/new-layout/pet/icons/picto_map.png)"
        }

        /***/
      },

    /***/ "./src/session_storage/session_storage.enum.ts":
      /*!*****************************************************!*\
  !*** ./src/session_storage/session_storage.enum.ts ***!
  \*****************************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ SessionStorageKey: () =>
            /* binding */ SessionStorageKey,
          /* harmony export */
        })
        var SessionStorageKey
        ;(function (SessionStorageKey) {
          SessionStorageKey["action"] = "action"
          SessionStorageKey["explorationsDone"] = "explorationsDone"
          SessionStorageKey["minigamesDone"] = "minigamesDone"
          SessionStorageKey["selectedLocation"] = "selectedLocation"
          SessionStorageKey["takeover"] = "takeover"
          SessionStorageKey["wishlist"] = "wishlist"
          SessionStorageKey["summerGameDone"] = "summerGameDone"
        })(SessionStorageKey || (SessionStorageKey = {}))

        /***/
      },

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

        class SessionStorage {
          static sessionStorage = sessionStorage
          constructor() {}
          static get action() {
            return this.getItem(
              _session_storage_enum__WEBPACK_IMPORTED_MODULE_0__
                .SessionStorageKey.action,
              null
            )
          }
          static set action(action) {
            this.setItem(
              _session_storage_enum__WEBPACK_IMPORTED_MODULE_0__
                .SessionStorageKey.action,
              action
            )
          }
          static get explorationsDone() {
            return this.getItem(
              _session_storage_enum__WEBPACK_IMPORTED_MODULE_0__
                .SessionStorageKey.explorationsDone,
              false
            )
          }
          static set explorationsDone(done) {
            this.setItem(
              _session_storage_enum__WEBPACK_IMPORTED_MODULE_0__
                .SessionStorageKey.explorationsDone,
              done
            )
          }
          static get minigamesDone() {
            return this.getItem(
              _session_storage_enum__WEBPACK_IMPORTED_MODULE_0__
                .SessionStorageKey.minigamesDone,
              false
            )
          }
          static set minigamesDone(done) {
            this.setItem(
              _session_storage_enum__WEBPACK_IMPORTED_MODULE_0__
                .SessionStorageKey.minigamesDone,
              done
            )
          }
          static get summerGameDone() {
            return this.getItem(
              _session_storage_enum__WEBPACK_IMPORTED_MODULE_0__
                .SessionStorageKey.summerGameDone,
              false
            )
          }
          static set summerGameDone(done) {
            this.setItem(
              _session_storage_enum__WEBPACK_IMPORTED_MODULE_0__
                .SessionStorageKey.summerGameDone,
              done
            )
          }
          static get selectedLocation() {
            return this.getItem(
              _session_storage_enum__WEBPACK_IMPORTED_MODULE_0__
                .SessionStorageKey.selectedLocation,
              null
            )
          }
          static set selectedLocation(selected) {
            this.setItem(
              _session_storage_enum__WEBPACK_IMPORTED_MODULE_0__
                .SessionStorageKey.selectedLocation,
              selected
            )
          }
          static get takeover() {
            return this.getItem(
              _session_storage_enum__WEBPACK_IMPORTED_MODULE_0__
                .SessionStorageKey.takeover,
              false
            )
          }
          static set takeover(enabled) {
            this.setItem(
              _session_storage_enum__WEBPACK_IMPORTED_MODULE_0__
                .SessionStorageKey.takeover,
              enabled
            )
          }
          static get wishlist() {
            return this.getItem(
              _session_storage_enum__WEBPACK_IMPORTED_MODULE_0__
                .SessionStorageKey.wishlist,
              []
            )
          }
          static set wishlist(wishlist) {
            this.setItem(
              _session_storage_enum__WEBPACK_IMPORTED_MODULE_0__
                .SessionStorageKey.wishlist,
              wishlist
            )
          }
          static getItem(key, fallback) {
            return (
              JSON.parse(
                this.sessionStorage.getItem(key) ?? JSON.stringify(fallback)
              ) ?? fallback
            )
          }
          static setItem(key, value) {
            this.sessionStorage.setItem(key, JSON.stringify(value))
          }
        }

        /***/
      },

    /***/ "./src/session_storage/takeover_action.enum.ts":
      /*!*****************************************************!*\
  !*** ./src/session_storage/takeover_action.enum.ts ***!
  \*****************************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ TakeoverAction: () =>
            /* binding */ TakeoverAction,
          /* harmony export */
        })
        var TakeoverAction
        ;(function (TakeoverAction) {
          TakeoverAction["daily"] = "daily"
          TakeoverAction["minigames"] = "minigames"
          TakeoverAction["explorations"] = "explorations"
          TakeoverAction["auctions"] = "auctions"
          TakeoverAction["buy"] = "buy"
          // sell,
          TakeoverAction["summerGame"] = "summerGame"
          TakeoverAction["wait"] = "wait"
        })(TakeoverAction || (TakeoverAction = {}))

        /***/
      },

    /***/ "./src/takeover/brain.ts":
      /*!*******************************!*\
  !*** ./src/takeover/brain.ts ***!
  \*******************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadTakeover: () => /* binding */ loadTakeover,
          /* harmony export */ toggleTakeover: () =>
            /* binding */ toggleTakeover,
          /* harmony export */ resetTakeover: () => /* binding */ resetTakeover,
          /* harmony export */
        })
        /* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(/*! ../console */ "./src/console.ts")
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(
            /*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts"
          )
        /* harmony import */ var _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__ =
          __webpack_require__(
            /*! ../session_storage/session_storage */ "./src/session_storage/session_storage.ts"
          )
        /* harmony import */ var _ui_top_bar__WEBPACK_IMPORTED_MODULE_4__ =
          __webpack_require__(/*! ../ui/top_bar */ "./src/ui/top_bar.ts")
        /* harmony import */ var _classes_buy_action__WEBPACK_IMPORTED_MODULE_5__ =
          __webpack_require__(
            /*! ./classes/buy_action */ "./src/takeover/classes/buy_action.ts"
          )
        /* harmony import */ var _classes_daily_action__WEBPACK_IMPORTED_MODULE_6__ =
          __webpack_require__(
            /*! ./classes/daily_action */ "./src/takeover/classes/daily_action.ts"
          )
        /* harmony import */ var _classes_exploration_action__WEBPACK_IMPORTED_MODULE_7__ =
          __webpack_require__(
            /*! ./classes/exploration_action */ "./src/takeover/classes/exploration_action.ts"
          )
        /* harmony import */ var _classes_minigame_action__WEBPACK_IMPORTED_MODULE_8__ =
          __webpack_require__(
            /*! ./classes/minigame_action */ "./src/takeover/classes/minigame_action.ts"
          )
        /* harmony import */ var _classes_summer_game_action__WEBPACK_IMPORTED_MODULE_9__ =
          __webpack_require__(
            /*! ./classes/summer_game_action */ "./src/takeover/classes/summer_game_action.ts"
          )
        /* harmony import */ var _classes_wait_action__WEBPACK_IMPORTED_MODULE_10__ =
          __webpack_require__(
            /*! ./classes/wait_action */ "./src/takeover/classes/wait_action.ts"
          )

        /** Automated entry point of the takeover. */
        function loadTakeover() {
          if (
            _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__
              .SessionStorage.takeover &&
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__
              .LocalStorage.unlocked
          )
            void takeover()
        }
        /** Manual entry point of the takeover. */
        function toggleTakeover() {
          resetTakeover()
          _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.takeover =
            !_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__
              .SessionStorage.takeover
          if (
            !_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__
              .LocalStorage.unlocked
          ) {
            _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.takeover = false
            return
          }
          ;(0, _ui_top_bar__WEBPACK_IMPORTED_MODULE_4__.loadTopBar)()
          if (
            _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__
              .SessionStorage.takeover
          )
            $.flavrNotif(
              _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.takeover
                .enabled
            )
          else
            $.flavrNotif(
              _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.takeover
                .disabled
            )
          void takeover()
        }
        function resetTakeover() {
          _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.action =
            null
          _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.explorationsDone = false
          _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.minigamesDone = false
          _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.selectedLocation =
            null
          _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.summerGameDone = false
          _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.wishlist =
            []
        }
        async function takeover() {
          if (
            !_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__
              .SessionStorage.takeover
          )
            return
          if (
            _classes_daily_action__WEBPACK_IMPORTED_MODULE_6__[
              "default"
            ].condition()
          )
            await _classes_daily_action__WEBPACK_IMPORTED_MODULE_6__[
              "default"
            ].perform()
          const action = actions.find(
            action =>
              action.key ===
              _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__
                .SessionStorage.action
          )
          if (action?.condition()) {
            _console__WEBPACK_IMPORTED_MODULE_0__.Console.info(
              "Action:",
              action.key
            )
            if (await action.perform()) return
          }
          changeAction()
          void takeover()
        }
        const actions = [
          _classes_exploration_action__WEBPACK_IMPORTED_MODULE_7__["default"],
          _classes_buy_action__WEBPACK_IMPORTED_MODULE_5__["default"],
          _classes_minigame_action__WEBPACK_IMPORTED_MODULE_8__["default"],
          _classes_summer_game_action__WEBPACK_IMPORTED_MODULE_9__.summerGameAction,
          _classes_wait_action__WEBPACK_IMPORTED_MODULE_10__["default"],
        ]
        function changeAction() {
          const next =
            actions.findIndex(
              action =>
                action.key ===
                _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__
                  .SessionStorage.action
            ) + 1
          return (_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_3__.SessionStorage.action =
            actions[next >= actions.length ? 0 : next].key)
        }

        /***/
      },

    /***/ "./src/takeover/classes/action.ts":
      /*!****************************************!*\
  !*** ./src/takeover/classes/action.ts ***!
  \****************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ Action: () => /* binding */ Action,
          /* harmony export */
        })
        class Action {}

        /***/
      },

    /***/ "./src/takeover/classes/buy_action.ts":
      /*!********************************************!*\
  !*** ./src/takeover/classes/buy_action.ts ***!
  \********************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
          /* harmony export */
        })
        /* harmony import */ var _ajax_ajax_search__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../../ajax/ajax_search */ "./src/ajax/ajax_search.ts"
          )
        /* harmony import */ var _ajax_buy__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(/*! ../../ajax/buy */ "./src/ajax/buy.ts")
        /* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(/*! ../../console */ "./src/console.ts")
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_3__ =
          __webpack_require__(
            /*! ../../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__ =
          __webpack_require__(
            /*! ../../local_storage/local_storage */ "./src/local_storage/local_storage.ts"
          )
        /* harmony import */ var _marketplace_marketplace_handlers__WEBPACK_IMPORTED_MODULE_5__ =
          __webpack_require__(
            /*! ../../marketplace/marketplace_handlers */ "./src/marketplace/marketplace_handlers.ts"
          )
        /* harmony import */ var _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_6__ =
          __webpack_require__(
            /*! ../../session_storage/takeover_action.enum */ "./src/session_storage/takeover_action.enum.ts"
          )
        /* harmony import */ var _action__WEBPACK_IMPORTED_MODULE_7__ =
          __webpack_require__(
            /*! ./action */ "./src/takeover/classes/action.ts"
          )

        class BuyAction extends _action__WEBPACK_IMPORTED_MODULE_7__.Action {
          key =
            _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_6__
              .TakeoverAction.buy
          get currentMaana() {
            return Number(
              document.querySelector("#currency-maana")?.dataset.maana
            )
          }
          condition() {
            return (
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__
                .LocalStorage.market &&
              Boolean(
                _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__
                  .LocalStorage.wishlist.length
              )
            )
          }
          async perform() {
            if (location.pathname !== "/marketplace") {
              pageLoad("/marketplace")
              return true
            }
            const iconMessage = __webpack_require__(
              /*! ../../templates/html/flavr_notif/icon_message.html */ "./src/templates/html/flavr_notif/icon_message.html"
            )
            for (const wished of _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__
              .LocalStorage.wishlist) {
              // Clothes might be a special exception. If they are, then check for
              // `wished.type === Type.PlayerWearableItem`.
              if (wished.error) {
                _console__WEBPACK_IMPORTED_MODULE_2__.Console.warn(
                  `Skipped "${wished.name}"`,
                  wished
                )
                continue
              }
              _console__WEBPACK_IMPORTED_MODULE_2__.Console.info(
                `Searching for "${wished.name}"`,
                wished
              )
              /** Search in each pages until the amount of items is less than 8 */
              let amount = 8
              forpage: for (let page = 1; amount === 8; page++) {
                let results = []
                try {
                  results = await this.search(wished, page)
                } catch (e) {
                  const error = e
                  _console__WEBPACK_IMPORTED_MODULE_2__.Console.error(
                    `Failed to search for "${wished.name}"`,
                    error
                  )
                  this.setError(wished.icon, `${error.statusText}`)
                  break forpage
                }
                amount = results.length
                _console__WEBPACK_IMPORTED_MODULE_2__.Console.log(
                  `Found ${amount} results`,
                  results
                )
                const wanted = results.filter(
                  result =>
                    result.icon === wished.icon &&
                    result.buyNowPrice &&
                    Number(result.buyNowPrice.price) <= wished.price &&
                    Number(result.buyNowPrice.price) <= this.currentMaana
                )
                for (const result of wanted) {
                  if (!(await this.buy(result))) break forpage
                  _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.purchases =
                    [
                      result,
                      ..._local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.purchases.filter(
                        purchase => purchase.itemid !== result.itemid
                      ),
                    ]
                  _console__WEBPACK_IMPORTED_MODULE_2__.Console.info(
                    `Bought "${result.name}" for ${Number(
                      result.buyNowPrice?.price
                    )} maanas.`,
                    result
                  )
                  $.flavrNotif(
                    iconMessage.render({
                      ...result,
                      message:
                        _i18n_translate__WEBPACK_IMPORTED_MODULE_3__.translate.takeover.bought(
                          result.name,
                          Number(result.buyNowPrice?.price)
                        ),
                    })
                  )
                }
              }
            }
            return false
          }
          /**
           * Purchase an item from the market.
           * @returns whether the item was successfully purchased.
           */
          async buy(result) {
            const json = await (0, _ajax_buy__WEBPACK_IMPORTED_MODULE_1__.buy)(
              Number(result.itemid)
            )
            if (json.result !== "success") this.setError(result.icon, json.data)
            return json.result === "success"
          }
          /** Search for a wished item on a specific page using the item's name. */
          async search(wished, page = 1) {
            // Put the name of the item in the filter
            const filterItemName = document.querySelector("#filter-itemName")
            if (filterItemName) filterItemName.value = wished.name
            // Show the results of the search
            const marketplaceSearchItems = document.querySelector(
              ".marketplace-search-items"
            )
            if (!marketplaceSearchItems) return []
            marketplaceSearchItems.innerHTML = await (0,
            _ajax_ajax_search__WEBPACK_IMPORTED_MODULE_0__.ajaxSearch)({
              name: wished.name,
              page,
            })
            return Array.from(
              marketplaceSearchItems.querySelectorAll(
                ".marketplace-search-item"
              )
            )
              .map(
                _marketplace_marketplace_handlers__WEBPACK_IMPORTED_MODULE_5__.getItemDetails
              )
              .filter(item => item !== null)
          }
          /** Set the `WishedItem.error` property without reordering the wishlist. */
          setError(icon, error) {
            const wishlist =
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__
                .LocalStorage.wishlist
            const index = wishlist.findIndex(item => item.icon === icon)
            const entry = wishlist[index]
            if (!entry) return
            entry.error = error
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_4__.LocalStorage.wishlist =
              [
                ...wishlist.slice(undefined, index),
                entry,
                ...wishlist.slice(index + 1, undefined),
              ]
          }
        }
        /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ =
          new BuyAction()

        /***/
      },

    /***/ "./src/takeover/classes/daily_action.ts":
      /*!**********************************************!*\
  !*** ./src/takeover/classes/daily_action.ts ***!
  \**********************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
          /* harmony export */
        })
        /* harmony import */ var _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../../session_storage/takeover_action.enum */ "./src/session_storage/takeover_action.enum.ts"
          )
        /* harmony import */ var _brain__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(/*! ../brain */ "./src/takeover/brain.ts")
        /* harmony import */ var _click__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(/*! ../click */ "./src/takeover/click.ts")

        class DailyAction {
          key =
            _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_0__
              .TakeoverAction.daily
          /** Checks if the daily maana gift if there. */
          condition() {
            const dailyGiftContainer = document.getElementById(
              "daily-gift-container"
            )
            return (
              !!dailyGiftContainer &&
              getComputedStyle(dailyGiftContainer).display !== "none"
            )
          }
          /**
           * Click on the daily maana gift.
           * @returns `false`. This action does not perform meaningful actions on the
           * page.
           */
          async perform() {
            const dailyGiftContainer = document.getElementById(
              "daily-gift-container"
            )
            if (
              !dailyGiftContainer ||
              getComputedStyle(dailyGiftContainer).display === "none"
            ) {
              return false
            }
            dailyGiftContainer.click()
            await (0, _click__WEBPACK_IMPORTED_MODULE_2__.click)(
              ".first-connexion .flavr-button.default"
            )
            ;(0, _brain__WEBPACK_IMPORTED_MODULE_1__.resetTakeover)()
            return false
          }
        }
        /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ =
          new DailyAction()

        /***/
      },

    /***/ "./src/takeover/classes/exploration_action.ts":
      /*!****************************************************!*\
  !*** ./src/takeover/classes/exploration_action.ts ***!
  \****************************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
          /* harmony export */
        })
        /* harmony import */ var _ajax_capture_end__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../../ajax/capture_end */ "./src/ajax/capture_end.ts"
          )
        /* harmony import */ var _ajax_change_region__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../../ajax/change_region */ "./src/ajax/change_region.ts"
          )
        /* harmony import */ var _ajax_exploration_results__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(
            /*! ../../ajax/exploration_results */ "./src/ajax/exploration_results.ts"
          )
        /* harmony import */ var _api_result_enum__WEBPACK_IMPORTED_MODULE_3__ =
          __webpack_require__(
            /*! ../../api/result.enum */ "./src/api/result.enum.ts"
          )
        /* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_4__ =
          __webpack_require__(/*! ../../console */ "./src/console.ts")
        /* harmony import */ var _duration__WEBPACK_IMPORTED_MODULE_5__ =
          __webpack_require__(/*! ../../duration */ "./src/duration.ts")
        /* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_6__ =
          __webpack_require__(
            /*! ../../local_storage/local_storage */ "./src/local_storage/local_storage.ts"
          )
        /* harmony import */ var _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_7__ =
          __webpack_require__(
            /*! ../../session_storage/session_storage */ "./src/session_storage/session_storage.ts"
          )
        /* harmony import */ var _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_8__ =
          __webpack_require__(
            /*! ../../session_storage/takeover_action.enum */ "./src/session_storage/takeover_action.enum.ts"
          )
        /* harmony import */ var _click__WEBPACK_IMPORTED_MODULE_9__ =
          __webpack_require__(/*! ../click */ "./src/takeover/click.ts")
        /* harmony import */ var _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__ =
          __webpack_require__(
            /*! ../exploration_status.enum */ "./src/takeover/exploration_status.enum.ts"
          )
        /* harmony import */ var _action__WEBPACK_IMPORTED_MODULE_11__ =
          __webpack_require__(
            /*! ./action */ "./src/takeover/classes/action.ts"
          )

        class ExplorationAction extends _action__WEBPACK_IMPORTED_MODULE_11__.Action {
          key =
            _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_8__
              .TakeoverAction.explorations
          get globals() {
            return {
              currentRegion,
              pendingTreasureHuntLocation,
              timeLeftExploration,
            }
          }
          condition() {
            return (
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_6__
                .LocalStorage.explorations &&
              !_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_7__
                .SessionStorage.explorationsDone &&
              !!_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_6__
                .LocalStorage.autoExploreLocations.length
            )
          }
          async perform() {
            if (location.pathname !== "/pet") {
              pageLoad("/pet")
              return true
            }
            const status = this.getExplorationStatus()
            _console__WEBPACK_IMPORTED_MODULE_4__.Console.log(
              "Exploration status:",
              _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
                .ExplorationStatus[status]
            )
            switch (status) {
              case _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
                .ExplorationStatus.idle:
                if (!(await this.startExploration()).selected)
                  _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_7__.SessionStorage.explorationsDone = true
                return false
              case _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
                .ExplorationStatus.pending:
                return (await this.waitExploration()) && this.perform()
              case _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
                .ExplorationStatus.result:
                await this.endExploration()
                return this.perform()
              case _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
                .ExplorationStatus.capture:
                await this.endCapture()
                return this.perform()
              default:
                return false
            }
          }
          async clickExplore() {
            return (0, _click__WEBPACK_IMPORTED_MODULE_9__.click)(
              "#explore-button"
            )
          }
          async clickLocation(selected) {
            return (0, _click__WEBPACK_IMPORTED_MODULE_9__.click)(
              `.map-location[data-id="${selected.location.id}"]`
            )
          }
          clickRegion(selected) {
            const div = document.querySelector(
              `.minimap[data-mapid="${selected.region.id}"]`
            )
            if (!div) {
              // Clearing invalid regions is useful to remove finished events.
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_6__.LocalStorage.autoExploreLocations =
                _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_6__.LocalStorage.autoExploreLocations.filter(
                  saved => saved.region.id !== selected.region.id
                )
              _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_7__.SessionStorage.selectedLocation =
                null
              pageLoad("/pet")
              return null
            }
            div.click()
            return div
          }
          async clickSeason() {
            return (0, _click__WEBPACK_IMPORTED_MODULE_9__.click)(
              "#crystal-images-container"
            )
          }
          async endCapture() {
            try {
              void new Audio(
                "/static/event/2021/music/sounds/mission-complete.mp3"
              ).play()
            } catch (e) {
              // eslint-disable-next-line no-empty
            }
            await (0, _click__WEBPACK_IMPORTED_MODULE_9__.click)(
              "#open-capture-interface"
            )
            await (0, _click__WEBPACK_IMPORTED_MODULE_9__.click)(
              "#capture-button"
            )
            await (0, _click__WEBPACK_IMPORTED_MODULE_9__.click)(
              "#close-result"
            )
          }
          async endExploration() {
            return (0, _click__WEBPACK_IMPORTED_MODULE_9__.click)(
              "#close-result"
            )
          }
          getCurrentSeason() {
            return (
              Array.from(document.querySelector("body")?.classList ?? [])
                .find(c => c.startsWith("season-"))
                ?.replace("season-", "") ?? null
            )
          }
          getExplorationStatus() {
            if (
              document.querySelector(
                "#treasure-hunt-result-overlay.active #open-capture-interface"
              ) ||
              document.querySelector("#capture-interface-outer.active")
            ) {
              return _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
                .ExplorationStatus.capture
            } else if (
              document.querySelector(
                "#pending-map-location-data-outer.active"
              ) ||
              document.querySelector("#map-container.pending")
            ) {
              return _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
                .ExplorationStatus.pending
            } else if (
              document.querySelector("#treasure-hunt-result-overlay.active")
            )
              return _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
                .ExplorationStatus.result
            return _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
              .ExplorationStatus.idle
          }
          getLowestEnergyLocation() {
            return _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_6__.LocalStorage.autoExploreLocations.reduce(
              (lowest, place) =>
                Number(place.location.energyRequired) <
                Number(lowest.location.energyRequired)
                  ? place
                  : lowest
            )
          }
          getSelectedLocation() {
            let selected =
              _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_7__
                .SessionStorage.selectedLocation
            if (!selected) {
              selected = this.selectLocation()
              _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_7__.SessionStorage.selectedLocation =
                selected
            }
            return selected
          }
          selectLocation() {
            const affordable =
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_6__.LocalStorage.autoExploreLocations.filter(
                saved => Number(saved.location.energyRequired) <= petEnergy
              )
            const minimumEnergy = this.getLowestEnergyLocation()
            const notDeadEnd = affordable.filter(
              place =>
                petEnergy - Number(place.location.energyRequired) >=
                Number(minimumEnergy.location.energyRequired)
            )
            if (notDeadEnd.length)
              return (
                notDeadEnd[Math.floor(Math.random() * notDeadEnd.length)] ??
                null
              )
            const sameEnergy = affordable.filter(
              place => Number(place.location.energyRequired) === petEnergy
            )
            if (sameEnergy.length)
              return (
                sameEnergy[Math.floor(Math.random() * sameEnergy.length)] ??
                null
              )
            return (
              affordable[Math.floor(Math.random() * affordable.length)] ?? null
            )
          }
          async startExploration() {
            const selected = this.getSelectedLocation()
            if (!selected) return { exploring: false, selected }
            _console__WEBPACK_IMPORTED_MODULE_4__.Console.info(
              "Exploring",
              selected
            )
            // Go to season
            if (
              selected.region.season &&
              this.getCurrentSeason() !== selected.region.season
            ) {
              await this.clickSeason()
              return { exploring: false, selected }
            }
            // Go to region
            this.clickRegion(selected)
            // Go to location
            await this.clickLocation(selected)
            await this.clickExplore()
            _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_7__.SessionStorage.selectedLocation =
              null
            return { exploring: true, selected }
          }
          /**
           * Wait for up to 10 minutes.
           * @returns whether the exploration is finished.
           */
          async waitExploration(selected) {
            document
              .querySelector(
                `.minimap[data-mapid="${
                  selected?.region.id ?? currentRegion.id
                }"]`
              )
              ?.click()
            let ms =
              3 * _duration__WEBPACK_IMPORTED_MODULE_5__.DurationUnit.second
            if (selected)
              ms +=
                selected.location.timeToExplore *
                _duration__WEBPACK_IMPORTED_MODULE_5__.DurationUnit.minute
            else if (timeLeftExploration && timeLeftExploration > 0)
              ms +=
                timeLeftExploration *
                _duration__WEBPACK_IMPORTED_MODULE_5__.DurationUnit.second
            else if (
              !pendingTreasureHuntLocation &&
              document.querySelector("#map-container.pending")
            ) {
              const json = await (0,
              _ajax_exploration_results__WEBPACK_IMPORTED_MODULE_2__.explorationResults)()
              if (
                json.result !==
                _api_result_enum__WEBPACK_IMPORTED_MODULE_3__.Result.success
              )
                return false
              const capture = json.data.results.find(
                result => result.type === "capture"
              )
              if (!capture) return false
              await (0,
              _ajax_capture_end__WEBPACK_IMPORTED_MODULE_0__.captureEnd)()
              // Reloading is the only possible action if the exploration finished in a
              // different region.
              _console__WEBPACK_IMPORTED_MODULE_4__.Console.error(
                "Reloading because the exploration is in another region.",
                this.globals
              )
              await new Promise(resolve =>
                setTimeout(
                  resolve,
                  _duration__WEBPACK_IMPORTED_MODULE_5__.DurationUnit.minute
                )
              )
              pageLoad("/pet")
              return true
            }
            if (
              ms >
              10 * _duration__WEBPACK_IMPORTED_MODULE_5__.DurationUnit.minute
            )
              return false
            _console__WEBPACK_IMPORTED_MODULE_4__.Console.log(
              `Waiting for the exploration to end in ${Math.ceil(
                ms / _duration__WEBPACK_IMPORTED_MODULE_5__.DurationUnit.second
              )} seconds...`,
              this.globals
            )
            await new Promise(resolve => setTimeout(resolve, ms))
            await (0,
            _ajax_change_region__WEBPACK_IMPORTED_MODULE_1__.changeRegion)(
              Number(selected?.region.id ?? currentRegion.id)
            )
            if (
              this.getExplorationStatus() ===
                _exploration_status_enum__WEBPACK_IMPORTED_MODULE_10__
                  .ExplorationStatus.pending &&
              timeLeftExploration &&
              timeLeftExploration < 0
            ) {
              _console__WEBPACK_IMPORTED_MODULE_4__.Console.info(
                "Reloading because the timer is desynchronised.",
                this.globals
              )
              await new Promise(resolve =>
                setTimeout(
                  resolve,
                  _duration__WEBPACK_IMPORTED_MODULE_5__.DurationUnit.second
                )
              )
              pageLoad("/pet")
            }
            return true
          }
        }
        /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ =
          new ExplorationAction()

        /***/
      },

    /***/ "./src/takeover/classes/minigame_action.ts":
      /*!*************************************************!*\
  !*** ./src/takeover/classes/minigame_action.ts ***!
  \*************************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
          /* harmony export */
        })
        /* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../../local_storage/local_storage */ "./src/local_storage/local_storage.ts"
          )
        /* harmony import */ var _minigames_emile__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../../minigames/emile */ "./src/minigames/emile.ts"
          )
        /* harmony import */ var _minigames_flappy__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(
            /*! ../../minigames/flappy */ "./src/minigames/flappy.ts"
          )
        /* harmony import */ var _minigames_hatchlings__WEBPACK_IMPORTED_MODULE_3__ =
          __webpack_require__(
            /*! ../../minigames/hatchlings */ "./src/minigames/hatchlings.ts"
          )
        /* harmony import */ var _minigames_peggle__WEBPACK_IMPORTED_MODULE_4__ =
          __webpack_require__(
            /*! ../../minigames/peggle */ "./src/minigames/peggle.ts"
          )
        /* harmony import */ var _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_5__ =
          __webpack_require__(
            /*! ../../session_storage/session_storage */ "./src/session_storage/session_storage.ts"
          )
        /* harmony import */ var _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_6__ =
          __webpack_require__(
            /*! ../../session_storage/takeover_action.enum */ "./src/session_storage/takeover_action.enum.ts"
          )

        class MinigameAction {
          key =
            _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_6__
              .TakeoverAction.minigames
          condition() {
            return (
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_0__
                .LocalStorage.minigames &&
              !_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_5__
                .SessionStorage.minigamesDone
            )
          }
          /** Determines if the minigames should be played right now.
           * @returns whether the minigames are currently being played.
           */
          async perform() {
            switch (location.pathname) {
              case "/minigames": {
                const playing =
                  this.openMinigame(
                    _minigames_peggle__WEBPACK_IMPORTED_MODULE_4__.peggle
                  ) ||
                  this.openMinigame(
                    _minigames_flappy__WEBPACK_IMPORTED_MODULE_2__.flappy
                  ) ||
                  this.openMinigame(
                    _minigames_hatchlings__WEBPACK_IMPORTED_MODULE_3__.hatchlings
                  )
                if (!playing) {
                  _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_5__.SessionStorage.minigamesDone = true
                  document
                    .querySelector('.minigames-rules [rel="btn-cancel"]')
                    ?.click()
                }
                return playing
              }
              case "/minigames/gembomb":
                await (0,
                _minigames_emile__WEBPACK_IMPORTED_MODULE_1__.playPeggle)()
                break
              case "/minigames/bubbltemple":
                await (0,
                _minigames_emile__WEBPACK_IMPORTED_MODULE_1__.playFlappy)()
                break
              case "/minigames/cocooninpick":
                await (0,
                _minigames_emile__WEBPACK_IMPORTED_MODULE_1__.playHatchlings)()
                break
              default:
                pageLoad("/minigames")
                return true
            }
            pageLoad("/minigames")
            return true
          }
          /** Click on a minigame's link. @returns whether the minigame was opened. */
          openMinigame(minigame) {
            const start = document.querySelector(minigame.buttonSelector)
            if (!start) {
              return false
            }
            start.click()
            return true
          }
        }
        /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ =
          new MinigameAction()

        /***/
      },

    /***/ "./src/takeover/classes/summer_game_action.ts":
      /*!****************************************************!*\
  !*** ./src/takeover/classes/summer_game_action.ts ***!
  \****************************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ summerGameAction: () =>
            /* binding */ summerGameAction,
          /* harmony export */
        })
        /* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(/*! ../../console */ "./src/console.ts")
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(
            /*! ../../local_storage/local_storage */ "./src/local_storage/local_storage.ts"
          )
        /* harmony import */ var _math_util__WEBPACK_IMPORTED_MODULE_3__ =
          __webpack_require__(/*! ../../math_util */ "./src/math_util.ts")
        /* harmony import */ var _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_4__ =
          __webpack_require__(
            /*! ../../session_storage/session_storage */ "./src/session_storage/session_storage.ts"
          )
        /* harmony import */ var _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_5__ =
          __webpack_require__(
            /*! ../../session_storage/takeover_action.enum */ "./src/session_storage/takeover_action.enum.ts"
          )
        /* harmony import */ var _action__WEBPACK_IMPORTED_MODULE_6__ =
          __webpack_require__(
            /*! ./action */ "./src/takeover/classes/action.ts"
          )

        class SummerGameAction extends _action__WEBPACK_IMPORTED_MODULE_6__.Action {
          key =
            _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_5__
              .TakeoverAction.summerGame
          condition() {
            return (
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__
                .LocalStorage.minigames &&
              !_session_storage_session_storage__WEBPACK_IMPORTED_MODULE_4__
                .SessionStorage.summerGameDone &&
              !!document.querySelector('a[href="/event/summer"]')
            )
          }
          async perform() {
            if (location.pathname !== "/event/summer/game") {
              pageLoad("/event/summer/game")
              return true
            }
            await new Promise(resolve => setTimeout(resolve, 3000))
            const play = document.querySelector(
              'button.summer2021-button.event-coin-button.active[data-currency="token"]'
            )
            _console__WEBPACK_IMPORTED_MODULE_0__.Console.log(
              "Looking for play button:",
              play
            )
            if (!play) {
              _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_4__.SessionStorage.summerGameDone = true
              return false
            }
            const started = await summerGameStart()
            if (started.result !== "success") {
              _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_4__.SessionStorage.summerGameDone = true
              return false
            }
            play.classList.remove("active")
            play.classList.add("inactive")
            const template = __webpack_require__(
              /*! ../../templates/html/flavr_notif/icon_message.html */ "./src/templates/html/flavr_notif/icon_message.html"
            )
            $.flavrNotif(
              template.render({
                icon: "/static/event/minigames/snake/img/head.png",
                message:
                  _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.minigames.playing(
                    "Snake"
                  ),
              })
            )
            await new Promise(resolve =>
              setTimeout(
                () => resolve(true),
                _math_util__WEBPACK_IMPORTED_MODULE_3__.MathUtil.randomBetween(
                  60_000 * 0.8,
                  60_000
                )
              )
            )
            const saved = await summerGameSave()
            if (saved.result !== "success") {
              _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_4__.SessionStorage.summerGameDone = true
              return false
            }
            $.flavrNotif(
              template.render({
                icon: "/static/event/minigames/snake/img/head.png",
                message:
                  _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.minigames.played(
                    "Snake"
                  ),
              })
            )
            pageLoad("/event/summer/game")
            return true
          }
        }
        async function summerGameStart() {
          const currency = "token"
          return new Promise(resolve => {
            void $.post(
              "/event/summer/game/start",
              { currency: currency },
              function (json) {
                if (json.result !== "success") $.flavrNotif(json.data)
                resolve(json)
              }
            )
          })
        }
        async function summerGameSave() {
          const win = true
          return new Promise(resolve => {
            void $.post(
              "/event/summer/game/save",
              { win: win },
              function (json) {
                if (json.result !== "success") $.flavrNotif(json.data)
                resolve(json)
              }
            )
          })
        }
        const summerGameAction = new SummerGameAction()

        /***/
      },

    /***/ "./src/takeover/classes/wait_action.ts":
      /*!*********************************************!*\
  !*** ./src/takeover/classes/wait_action.ts ***!
  \*********************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
          /* harmony export */
        })
        /* harmony import */ var _console__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(/*! ../../console */ "./src/console.ts")
        /* harmony import */ var _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../../session_storage/takeover_action.enum */ "./src/session_storage/takeover_action.enum.ts"
          )
        /* harmony import */ var _action__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(
            /*! ./action */ "./src/takeover/classes/action.ts"
          )

        class WaitAction extends _action__WEBPACK_IMPORTED_MODULE_2__.Action {
          key =
            _session_storage_takeover_action_enum__WEBPACK_IMPORTED_MODULE_1__
              .TakeoverAction.wait
          condition() {
            return true
          }
          async perform() {
            _console__WEBPACK_IMPORTED_MODULE_0__.Console.log(
              `Waiting for 10 minutes...`
            )
            return new Promise(resolve =>
              setTimeout(() => resolve(false), 10 * 60 * 1000)
            )
          }
        }
        /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ =
          new WaitAction()

        /***/
      },

    /***/ "./src/takeover/click.ts":
      /*!*******************************!*\
  !*** ./src/takeover/click.ts ***!
  \*******************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ click: () => /* binding */ click,
          /* harmony export */ wait: () => /* binding */ wait,
          /* harmony export */
        })
        async function click(selector) {
          return new Promise(resolve => {
            const interval = setInterval(() => {
              const element = document.querySelector(selector)
              if (!element) return
              clearInterval(interval)
              // Some elements don't have their click handlers ready until they're
              // hovered.
              const mouseEvent = document.createEvent("MouseEvent")
              mouseEvent.initEvent("mouseover")
              element.dispatchEvent(mouseEvent)
              setTimeout(() => {
                element.click()
                resolve(element)
              }, 800)
            }, 800)
          })
        }
        async function wait(selector) {
          return new Promise(resolve => {
            const interval = setInterval(() => {
              const element = document.querySelector(selector)
              if (!element) return
              clearInterval(interval)
              resolve(element)
            }, 800)
          })
        }

        /***/
      },

    /***/ "./src/takeover/exploration_status.enum.ts":
      /*!*************************************************!*\
  !*** ./src/takeover/exploration_status.enum.ts ***!
  \*************************************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ ExplorationStatus: () =>
            /* binding */ ExplorationStatus,
          /* harmony export */
        })
        var ExplorationStatus
        ;(function (ExplorationStatus) {
          ExplorationStatus[(ExplorationStatus["idle"] = 0)] = "idle"
          ExplorationStatus[(ExplorationStatus["result"] = 1)] = "result"
          ExplorationStatus[(ExplorationStatus["capture"] = 2)] = "capture"
          ExplorationStatus[(ExplorationStatus["pending"] = 3)] = "pending"
        })(ExplorationStatus || (ExplorationStatus = {}))

        /***/
      },

    /***/ "./src/ts_util.ts":
      /*!************************!*\
  !*** ./src/ts_util.ts ***!
  \************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ isEnum: () => /* binding */ isEnum,
          /* harmony export */
        })
        function isEnum(value, enumeration) {
          return Object.values(enumeration).includes(value)
        }

        /***/
      },

    /***/ "./src/ui/auctions.ts":
      /*!****************************!*\
  !*** ./src/ui/auctions.ts ***!
  \****************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadAuctions: () => /* binding */ loadAuctions,
          /* harmony export */
        })
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts"
          )

        function loadAuctions() {
          if (location.pathname !== "/marketplace/auctions") return
          const marketplaceActiveAuctions = document.querySelector(
            "#marketplace-active-auctions"
          )
          if (!marketplaceActiveAuctions) return
          const layout2col = document.querySelector(
            ".marketplace-main-container #layout-2col"
          )
          if (layout2col) layout2col.style.overflowX = "visible"
          loadHistory(marketplaceActiveAuctions)
        }
        function loadHistory(marketplaceActiveAuctions) {
          marketplaceActiveAuctions.querySelector("style")?.remove()
          marketplaceActiveAuctions.querySelector("#purchase-history")?.remove()
          marketplaceActiveAuctions.querySelector("#sale-history")?.remove()
          const template = __webpack_require__(
            /*! ../templates/html/market_history.html */ "./src/templates/html/market_history.html"
          )
          const history = {
            purchases:
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.purchases.map(
                purchase => ({
                  ...purchase,
                  date: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.market.auctions.date_time_format.format(
                    new Date(purchase.date)
                  ),
                })
              ),
            sales:
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.sales.map(
                sale => ({
                  ...sale,
                  date: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.market.auctions.date_time_format.format(
                    new Date(sale.date)
                  ),
                })
              ),
          }
          marketplaceActiveAuctions.insertAdjacentHTML(
            "beforeend",
            template.render({
              ...history,
              translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate,
            })
          )
          for (const purchase of document.querySelectorAll(
            "#purchase-history .marketplace-auctions-item"
          )) {
            const itemid = purchase.dataset.itemid
            purchase
              .querySelector(".delete-button")
              ?.addEventListener("click", () => {
                _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.purchases =
                  _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.purchases.filter(
                    purchase => purchase.itemid !== itemid
                  )
                loadHistory(marketplaceActiveAuctions)
              })
          }
          for (const sale of document.querySelectorAll(
            "#sale-history .marketplace-sales-item"
          )) {
            const icon = sale.querySelector(".abstract-icon img")?.src
            sale
              .querySelector(".delete-button")
              ?.addEventListener("click", () => {
                _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.sales =
                  _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.sales.filter(
                    sale => sale.icon !== icon
                  )
                loadHistory(marketplaceActiveAuctions)
              })
          }
        }

        /***/
      },

    /***/ "./src/ui/carousel.ts":
      /*!****************************!*\
  !*** ./src/ui/carousel.ts ***!
  \****************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadCarousel: () => /* binding */ loadCarousel,
          /* harmony export */
        })
        /* harmony import */ var _carousel_carousel_beemoov_annoyances__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../carousel/carousel_beemoov_annoyances */ "./src/carousel/carousel_beemoov_annoyances.ts"
          )
        /* harmony import */ var _carousel_carousel_download_face__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../carousel/carousel_download_face */ "./src/carousel/carousel_download_face.ts"
          )
        /* harmony import */ var _carousel_carousel_download_guardian__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(
            /*! ../carousel/carousel_download_guardian */ "./src/carousel/carousel_download_guardian.ts"
          )
        /* harmony import */ var _carousel_carousel_eldarya_enhancements__WEBPACK_IMPORTED_MODULE_3__ =
          __webpack_require__(
            /*! ../carousel/carousel_eldarya_enhancements */ "./src/carousel/carousel_eldarya_enhancements.ts"
          )
        /* harmony import */ var _carousel_carousel_takeover__WEBPACK_IMPORTED_MODULE_4__ =
          __webpack_require__(
            /*! ../carousel/carousel_takeover */ "./src/carousel/carousel_takeover.ts"
          )
        /* harmony import */ var _download_canvas__WEBPACK_IMPORTED_MODULE_5__ =
          __webpack_require__(
            /*! ../download-canvas */ "./src/download-canvas.ts"
          )
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_6__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_7__ =
          __webpack_require__(
            /*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts"
          )
        /* harmony import */ var _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_8__ =
          __webpack_require__(
            /*! ../session_storage/session_storage */ "./src/session_storage/session_storage.ts"
          )
        /* harmony import */ var _takeover_brain__WEBPACK_IMPORTED_MODULE_9__ =
          __webpack_require__(
            /*! ../takeover/brain */ "./src/takeover/brain.ts"
          )

        function loadCarousel() {
          const carouselInner = document.querySelector("#carousel-inner")
          if (!carouselInner || document.querySelector(".carousel-ee")) {
            return
          }
          // Import carousel template
          const template = __webpack_require__(
            /*! ../templates/html/carousel_news.html */ "./src/templates/html/carousel_news.html"
          )
          const contexts = [
            // Intro
            _carousel_carousel_eldarya_enhancements__WEBPACK_IMPORTED_MODULE_3__.carouselEE,
            // Features
            ...((_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_7__
              .LocalStorage.minigames ||
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_7__
                .LocalStorage.explorations ||
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_7__
                .LocalStorage.market) &&
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_7__
              .LocalStorage.unlocked
              ? [
                  _carousel_carousel_takeover__WEBPACK_IMPORTED_MODULE_4__.carouselTakeover,
                ]
              : []),
            _carousel_carousel_download_guardian__WEBPACK_IMPORTED_MODULE_2__.carouselDownloadGuardian,
            _carousel_carousel_download_face__WEBPACK_IMPORTED_MODULE_1__.carouselDownloadFace,
            // Ads
            _carousel_carousel_beemoov_annoyances__WEBPACK_IMPORTED_MODULE_0__.carouselBeemoovAnnoyances,
          ]
          // Add entries to the carousel
          carouselInner.insertAdjacentHTML(
            "beforeend",
            contexts.map(banner => template.render(banner)).join("\n")
          )
          // Add links
          for (const carousel of contexts) {
            if (!carousel.href) continue
            const element = carouselInner.querySelector(`#${carousel.id}`)
            if (!element) continue
            element.addEventListener("click", () => {
              if (element.classList.contains("active"))
                open(carousel.href, "_blank")
            })
          }
          // Add click events
          document
            .getElementById(
              _carousel_carousel_download_face__WEBPACK_IMPORTED_MODULE_1__
                .carouselDownloadFace.id
            )
            ?.addEventListener(
              "click",
              _download_canvas__WEBPACK_IMPORTED_MODULE_5__.downloadFace
            )
          document
            .getElementById(
              _carousel_carousel_download_guardian__WEBPACK_IMPORTED_MODULE_2__
                .carouselDownloadGuardian.id
            )
            ?.addEventListener(
              "click",
              _download_canvas__WEBPACK_IMPORTED_MODULE_5__.downloadGuardian
            )
          const takeoverAnchor = document.getElementById(
            _carousel_carousel_takeover__WEBPACK_IMPORTED_MODULE_4__
              .carouselTakeover.id
          )
          takeoverAnchor?.addEventListener("click", () => {
            ;(0, _takeover_brain__WEBPACK_IMPORTED_MODULE_9__.toggleTakeover)()
            takeoverTitle(takeoverAnchor)
          })
          if (takeoverAnchor) takeoverTitle(takeoverAnchor)
        }
        function takeoverTitle(takeoverAnchor) {
          const takeoverH4 = takeoverAnchor.querySelector("h4")
          if (takeoverH4) {
            takeoverH4.innerText =
              _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_8__
                .SessionStorage.takeover
                ? _i18n_translate__WEBPACK_IMPORTED_MODULE_6__.translate
                    .carousel.takeover.disable_takeover
                : _i18n_translate__WEBPACK_IMPORTED_MODULE_6__.translate
                    .carousel.takeover.enable_takeover
          }
        }

        /***/
      },

    /***/ "./src/ui/favourites.ts":
      /*!******************************!*\
  !*** ./src/ui/favourites.ts ***!
  \******************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadFavourites: () =>
            /* binding */ loadFavourites,
          /* harmony export */ loadFakeFavourites: () =>
            /* binding */ loadFakeFavourites,
          /* harmony export */
        })
        /* harmony import */ var _appearance_fake_favourites__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../appearance/fake_favourites */ "./src/appearance/fake_favourites.ts"
          )
        /* harmony import */ var _appearance_favourites_actions__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../appearance/favourites_actions */ "./src/appearance/favourites_actions.ts"
          )
        /* harmony import */ var _download_canvas__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(
            /*! ../download-canvas */ "./src/download-canvas.ts"
          )
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_3__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_4__ =
          __webpack_require__(
            /*! ../indexed_db/indexed_db */ "./src/indexed_db/indexed_db.ts"
          )

        function loadFavourites() {
          loadFavouritesActions()
          void loadFakeFavourites()
        }
        function loadFavouritesActions() {
          const actions = document.getElementById("favorites-actions")
          if (!actions || document.querySelector(".favorites-action-ee")) return
          const actionTemplate = __webpack_require__(
            /*! ../templates/html/favourites_action.html */ "./src/templates/html/favourites_action.html"
          )
          const importAction = {
            id: "import-outfit",
            text: _i18n_translate__WEBPACK_IMPORTED_MODULE_3__.translate
              .appearance.favourites.buttons["import"],
          }
          const exportAction = {
            id: "export-outfit",
            text: _i18n_translate__WEBPACK_IMPORTED_MODULE_3__.translate
              .appearance.favourites.buttons["export"],
          }
          const downloadAction = {
            id: "download-outfit",
            text: _i18n_translate__WEBPACK_IMPORTED_MODULE_3__.translate
              .appearance.favourites.buttons.download,
          }
          actions.insertAdjacentHTML(
            "beforeend",
            actionTemplate.render(importAction) +
              actionTemplate.render(exportAction) +
              actionTemplate.render(downloadAction)
          )
          document
            .getElementById(importAction.id)
            ?.addEventListener(
              "click",
              _appearance_favourites_actions__WEBPACK_IMPORTED_MODULE_1__.importOutfit
            )
          document
            .getElementById(exportAction.id)
            ?.addEventListener(
              "click",
              _appearance_favourites_actions__WEBPACK_IMPORTED_MODULE_1__.exportPreview
            )
          document
            .getElementById(downloadAction.id)
            ?.addEventListener(
              "click",
              _download_canvas__WEBPACK_IMPORTED_MODULE_2__.downloadAppearance
            )
        }
        async function loadFakeFavourites() {
          const thumbs = document.querySelector(
            "#all-outfit-thumbs .mCSB_container"
          )
          if (!thumbs) return
          const template = __webpack_require__(
            /*! ../templates/html/outfit_thumbs.html */ "./src/templates/html/outfit_thumbs.html"
          )
          const favourites =
            await _indexed_db_indexed_db__WEBPACK_IMPORTED_MODULE_4__[
              "default"
            ].getFavouriteOutfits()
          document.querySelector("#ee-outfit-thumbs")?.remove()
          thumbs.insertAdjacentHTML(
            "beforeend",
            template.render({
              outfits: favourites,
            })
          )
          document
            .querySelector(".ee-available-slot")
            ?.addEventListener(
              "click",
              () =>
                void (0,
                _appearance_fake_favourites__WEBPACK_IMPORTED_MODULE_0__.saveFavourite)()
            )
          for (const div of document.querySelectorAll(".ee-outfit-thumb")) {
            div.addEventListener("click", () => {
              const favourite = favourites.find(
                favourite => favourite.id === Number(div.dataset.arrayIndex)
              )
              if (!favourite) return
              ;(0,
              _appearance_fake_favourites__WEBPACK_IMPORTED_MODULE_0__.showFavourite)(
                favourite
              )
            })
          }
        }

        /***/
      },

    /***/ "./src/ui/home_content.ts":
      /*!********************************!*\
  !*** ./src/ui/home_content.ts ***!
  \********************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadHomeContent: () =>
            /* binding */ loadHomeContent,
          /* harmony export */
        })
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )

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

        /***/
      },

    /***/ "./src/ui/mall.ts":
      /*!************************!*\
  !*** ./src/ui/mall.ts ***!
  \************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadMall: () => /* binding */ loadMall,
          /* harmony export */ addToWishlistFlavr: () =>
            /* binding */ addToWishlistFlavr,
          /* harmony export */
        })
        /* harmony import */ var _eldarya_util__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(/*! ../eldarya_util */ "./src/eldarya_util.ts")
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(
            /*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts"
          )
        /* harmony import */ var _marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_3__ =
          __webpack_require__(
            /*! ../marketplace/enums/rarity.enum */ "./src/marketplace/enums/rarity.enum.ts"
          )

        function loadMall() {
          if (!location.pathname.startsWith("/mall")) return
          for (const li of document.querySelectorAll("[data-product]"))
            li.addEventListener("click", () => addWishlistButton(li))
        }
        function addWishlistButton(li) {
          document.querySelector("#add-to-wishlist")?.remove()
          document
            .querySelector("#mall-productDetail-info")
            ?.insertAdjacentHTML(
              "beforeend",
              "<button id='add-to-wishlist' class='nl-button' style='margin: 20px auto 0; min-width: 200px;'>Add to market wishlist</button>"
            )
          const maxQuantity = li.querySelector(".item-maxQuantity")
          const mallEntry = {
            product: JSON.parse(li.dataset.product),
            icon: (0, _eldarya_util__WEBPACK_IMPORTED_MODULE_0__.trimIcon)(
              li.querySelector("img.mall-product-icon").src
            ),
            rarity:
              _marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_3__
                .Rarity[
                li
                  .querySelector(
                    ".rarity-marker-common, .rarity-marker-rare, .rarity-marker-epic, .rarity-marker-legendary, .rarity-marker-event"
                  )
                  ?.className.split("rarity-marker-")[1] ?? ""
              ],
            maxQuantity: maxQuantity
              ? Number(maxQuantity.innerText)
              : undefined,
            abstractType:
              document.querySelector(
                "#mall-menu .tooltip.active .tooltip-content"
              )?.innerText ?? "",
          }
          document
            .querySelector("#add-to-wishlist")
            ?.addEventListener("click", () => addToWishlistFlavr(mallEntry))
        }
        function addToWishlistFlavr(mallEntry) {
          const template = __webpack_require__(
            /*! ../templates/html/auto_buy_flavr_mall.html */ "./src/templates/html/auto_buy_flavr_mall.html"
          )
          $.flavr({
            content: template.render({
              translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate,
            }),
            buttons: {
              close: { style: "close" },
              save: {
                action: () => save(mallEntry),
              },
            },
            dialog: "prompt",
            prompt: {
              value: "",
            },
            onBuild: $container => {
              $container.addClass("new-layout-popup")
              document
                .querySelector(".flavr-prompt")
                ?.addEventListener("keyup", ({ key }) => {
                  if (key !== "Enter") return
                  save(mallEntry)
                })
            },
          })
        }
        function save(mallEntry) {
          const price = Number(
            document.querySelector(".flavr-prompt")?.value.trim()
          )
          if (!price || price <= 0) {
            $.flavrNotif(
              _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.market
                .add_to_wishlist.invalid_price
            )
            return false
          }
          const wishlist =
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.wishlist.filter(
              wishlistEntry => wishlistEntry.icon !== mallEntry.icon
            )
          const wished = {
            ...mallEntry,
            ...mallEntry.product,
            price,
          }
          wishlist.push(wished)
          wishlist.sort((a, b) => {
            const typeCompare = a.type.localeCompare(b.type)
            if (typeCompare !== 0) return typeCompare
            const abstractTypeCompare = (a.abstractType ?? "").localeCompare(
              b.abstractType ?? ""
            )
            if (abstractTypeCompare !== 0) return abstractTypeCompare
            const rarityCompare =
              Object.keys(
                _marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_3__.Rarity
              ).indexOf(a.rarity ?? "") -
              Object.keys(
                _marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_3__.Rarity
              ).indexOf(b.rarity ?? "")
            if (rarityCompare !== 0) return rarityCompare
            return a.name.localeCompare(b.name)
          })
          _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.wishlist =
            wishlist
          const template = __webpack_require__(
            /*! ../templates/html/flavr_notif/icon_message.html */ "./src/templates/html/flavr_notif/icon_message.html"
          )
          $.flavrNotif(
            template.render({
              ...wished,
              message:
                _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.market.add_to_wishlist.added_to_wishlist(
                  wished.name,
                  wished.price
                ),
            })
          )
          return true
        }

        /***/
      },

    /***/ "./src/ui/market.ts":
      /*!**************************!*\
  !*** ./src/ui/market.ts ***!
  \**************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadMarket: () => /* binding */ loadMarket,
          /* harmony export */
        })
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts"
          )
        /* harmony import */ var _marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(
            /*! ../marketplace/enums/rarity.enum */ "./src/marketplace/enums/rarity.enum.ts"
          )
        /* harmony import */ var _marketplace_marketplace_handlers__WEBPACK_IMPORTED_MODULE_3__ =
          __webpack_require__(
            /*! ../marketplace/marketplace_handlers */ "./src/marketplace/marketplace_handlers.ts"
          )

        let marketObserver
        function loadMarket() {
          marketObserver?.disconnect()
          marketObserver = null
          if (location.pathname !== "/marketplace") return
          // `.marketplace-search-items` is the container whose HTML content is being
          // replaced on every action.
          const searchItems = document.querySelector(
            ".marketplace-search-items"
          )
          if (!searchItems) return
          marketObserver = new MutationObserver(loadWishlist)
          marketObserver.observe(searchItems, {
            childList: true,
          })
          loadWishlist()
        }
        function loadWishlist() {
          for (const li of document.querySelectorAll(".marketplace-abstract")) {
            li.addEventListener("click", () =>
              new MutationObserver((_, observer) => {
                const marketEntry = (0,
                _marketplace_marketplace_handlers__WEBPACK_IMPORTED_MODULE_3__.getItemDetails)(
                  li
                )
                if (!marketEntry) return
                addWishistButton(marketEntry, observer)
              }).observe(document.getElementById("marketplace-zoom"), {
                childList: true,
              })
            )
          }
        }
        function addWishistButton(marketEntry, observer) {
          const buttonsContainer = document.querySelector(
            "#marketplace-itemDetail"
          )
          if (!buttonsContainer) return
          observer?.disconnect()
          hijackBuyButtons(marketEntry)
          document
            .getElementById("marketplace-itemDetail-info-autobuy")
            ?.remove()
          const buttonTemplate = __webpack_require__(
            /*! ../templates/html/auto_buy_button.html */ "./src/templates/html/auto_buy_button.html"
          )
          buttonsContainer.insertAdjacentHTML(
            "beforeend",
            buttonTemplate.render({
              translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate,
            })
          )
          buttonsContainer
            .querySelector("#marketplace-itemDetail-info-autobuy")
            ?.addEventListener("click", () => addToWishlistFlavr(marketEntry))
        }
        function addToWishlistFlavr(marketEntry) {
          const template = __webpack_require__(
            /*! ../templates/html/auto_buy_flavr.html */ "./src/templates/html/auto_buy_flavr.html"
          )
          $.flavr({
            content: template.render({
              translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate,
            }),
            buttons: {
              close: { style: "close" },
              save: {
                action: () => save(marketEntry),
              },
            },
            dialog: "prompt",
            prompt: {
              value: "",
            },
            onBuild: $container => {
              $container.addClass("new-layout-popup")
              document
                .querySelector(".flavr-prompt")
                ?.addEventListener("keyup", ({ key }) => {
                  if (key !== "Enter") return
                  save(marketEntry)
                })
            },
          })
        }
        function save(marketEntry) {
          const price = Number(
            document.querySelector(".flavr-prompt")?.value.trim()
          )
          if (!price || price <= 0) {
            $.flavrNotif(
              _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.market
                .add_to_wishlist.invalid_price
            )
            return false
          }
          const wishlist =
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.wishlist.filter(
              wishlistEntry => wishlistEntry.icon !== marketEntry.icon
            )
          const wished = { ...marketEntry, price }
          wishlist.push(wished)
          wishlist.sort((a, b) => {
            const typeCompare = a.type.localeCompare(b.type)
            if (typeCompare !== 0) return typeCompare
            const abstractTypeCompare = (a.abstractType ?? "").localeCompare(
              b.abstractType ?? ""
            )
            if (abstractTypeCompare !== 0) return abstractTypeCompare
            const rarityCompare =
              Object.keys(
                _marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_2__.Rarity
              ).indexOf(a.rarity ?? "") -
              Object.keys(
                _marketplace_enums_rarity_enum__WEBPACK_IMPORTED_MODULE_2__.Rarity
              ).indexOf(b.rarity ?? "")
            if (rarityCompare !== 0) return rarityCompare
            return a.name.localeCompare(b.name)
          })
          _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.wishlist =
            wishlist
          const template = __webpack_require__(
            /*! ../templates/html/flavr_notif/icon_message.html */ "./src/templates/html/flavr_notif/icon_message.html"
          )
          $.flavrNotif(
            template.render({
              ...wished,
              message:
                _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.market.add_to_wishlist.added_to_wishlist(
                  wished.name,
                  wished.price
                ),
            })
          )
          return true
        }
        function hijackBuyButtons(marketEntry) {
          document
            .querySelector(".marketplace-itemDetail-buy")
            ?.addEventListener("click", () => {
              addPurchase(marketEntry)
            })
        }
        function addPurchase(marketEntry) {
          _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.purchases =
            [
              marketEntry,
              ..._local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.purchases.filter(
                purchase => purchase.itemid !== marketEntry.itemid
              ),
            ]
        }

        /***/
      },

    /***/ "./src/ui/menu.ts":
      /*!************************!*\
  !*** ./src/ui/menu.ts ***!
  \************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadMenu: () => /* binding */ loadMenu,
          /* harmony export */
        })
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )

        function loadMenu() {
          const menuInnerRight = document.getElementById("menu-inner-right")
          if (!menuInnerRight || menuInnerRight.querySelector(".main-menu-ee"))
            return
          // Remove bank
          menuInnerRight.querySelector(".main-menu-bank")?.remove()
          // Add Forum
          const menuTemplate = __webpack_require__(
            /*! ../templates/html/main_menu.html */ "./src/templates/html/main_menu.html"
          )
          const mainMenuForum = {
            class: "forum",
            href: "/forum",
            text: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.home
              .forum,
          }
          menuInnerRight.insertAdjacentHTML(
            "beforeend",
            menuTemplate.render(mainMenuForum)
          )
        }

        /***/
      },

    /***/ "./src/ui/pet.ts":
      /*!***********************!*\
  !*** ./src/ui/pet.ts ***!
  \***********************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadPet: () => /* binding */ loadPet,
          /* harmony export */
        })
        /* harmony import */ var _pet_exploration__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../pet/exploration */ "./src/pet/exploration.ts"
          )
        /* harmony import */ var _pet_exploration_history__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../pet/exploration-history */ "./src/pet/exploration-history.ts"
          )

        let petObserver
        function loadExplorations() {
          petObserver?.disconnect()
          petObserver = null
          /** `.page-main-container` changes background depending on the currently selected region. */
          const mainContainer = document.querySelector(".page-main-container")
          if (!mainContainer) return
          petObserver = new MutationObserver(loadExplorations)
          petObserver.observe(mainContainer, {
            attributes: true,
          })
          ;(0, _pet_exploration__WEBPACK_IMPORTED_MODULE_0__.loadMarkers)()
        }
        function loadPet() {
          if (location.pathname !== "/pet") return
          loadExplorations()
          ;(0,
          _pet_exploration_history__WEBPACK_IMPORTED_MODULE_1__.loadExplorationHistory)()
        }

        /***/
      },

    /***/ "./src/ui/profile.ts":
      /*!***************************!*\
  !*** ./src/ui/profile.ts ***!
  \***************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadProfile: () => /* binding */ loadProfile,
          /* harmony export */
        })
        /* harmony import */ var _download_canvas__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../download-canvas */ "./src/download-canvas.ts"
          )
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _outfit__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(/*! ../outfit */ "./src/outfit.ts")

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

        /***/
      },

    /***/ "./src/ui/purro_shop.ts":
      /*!******************************!*\
  !*** ./src/ui/purro_shop.ts ***!
  \******************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadPurroShop: () => /* binding */ loadPurroShop,
          /* harmony export */
        })
        /* harmony import */ var _api_meta__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(/*! ../api/meta */ "./src/api/meta.ts")
        /* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts"
          )

        /** Shows a Purro'Shop button in the main menu when it's available. */
        function loadPurroShop() {
          document.querySelector(".main-menu-purroshop")?.remove()
          // A bug in WebPack prevents using `LocalStorage.meta?.purroshop.status`.
          if (
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__
              .LocalStorage.meta === null ||
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__
              .LocalStorage.meta.purroshop.status !==
              _api_meta__WEBPACK_IMPORTED_MODULE_0__.PurroshopStatus.enabled
          )
            return
          const template = __webpack_require__(
            /*! ../templates/html/main_menu_purroshop.html */ "./src/templates/html/main_menu_purroshop.html"
          )
          document
            .getElementById("menu-inner-left")
            ?.insertAdjacentHTML("afterbegin", template.render({}))
        }

        /***/
      },

    /***/ "./src/ui/settings.ts":
      /*!****************************!*\
  !*** ./src/ui/settings.ts ***!
  \****************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadSettings: () => /* binding */ loadSettings,
          /* harmony export */
        })
        /* harmony import */ var _download_canvas__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../download-canvas */ "./src/download-canvas.ts"
          )
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(
            /*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts"
          )

        async function loadSettings() {
          const accountRight = document.querySelector("#account-right div")
          if (!accountRight || accountRight.querySelector(".account-ee-bloc"))
            return
          const settingsTemplate = __webpack_require__(
            /*! ../templates/html/settings.html */ "./src/templates/html/settings.html"
          )
          accountRight.insertAdjacentHTML(
            "beforeend",
            settingsTemplate.render({
              ...(await _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.getSettings()),
              translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate,
            })
          )
          document
            .getElementById("ee-debug-enabled")
            ?.addEventListener("click", () => {
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.debug =
                !_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__
                  .LocalStorage.debug
              reloadSettings()
            })
          if (
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__
              .LocalStorage.unlocked
          ) {
            document
              .getElementById("ee-minigames-enabled")
              ?.addEventListener("click", () => {
                _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.minigames =
                  !_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__
                    .LocalStorage.minigames
                reloadSettings()
              })
            document
              .getElementById("ee-explorations-enabled")
              ?.addEventListener("click", () => {
                _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.explorations =
                  !_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__
                    .LocalStorage.explorations
                reloadSettings()
              })
            document
              .getElementById("ee-market-enabled")
              ?.addEventListener("click", () => {
                _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.market =
                  !_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__
                    .LocalStorage.market
                reloadSettings()
              })
          }
          document
            .getElementById("ee-import")
            ?.addEventListener("click", importSettings)
          document
            .getElementById("ee-export")
            ?.addEventListener("click", () => void exportSettings())
        }
        function reloadSettings() {
          document.querySelector(".account-ee-bloc")?.remove()
          void loadSettings()
        }
        function importSettings() {
          const input = document.createElement("input")
          input.setAttribute("type", "file")
          input.setAttribute("accept", "application/json")
          input.click()
          input.addEventListener("input", event => {
            if (!event.target) return
            const files = event.target.files
            if (!files) return
            const file = files[0]
            if (!file) return
            void file.text().then(async value => {
              if (!value) return
              const parsed = JSON.parse(value)
              await _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.setSettings(
                parsed
              )
              reloadSettings()
              $.flavrNotif(
                _i18n_translate__WEBPACK_IMPORTED_MODULE_1__.translate.account
                  .imported
              )
            })
          })
        }
        async function exportSettings() {
          const href =
            "data:text/json;charset=utf-8," +
            encodeURIComponent(
              JSON.stringify(
                await _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_2__.LocalStorage.getSettings(),
                null,
                2
              )
            )
          const a = document.createElement("a")
          a.setAttribute("href", href)
          a.setAttribute(
            "download",
            `${
              (0, _download_canvas__WEBPACK_IMPORTED_MODULE_0__.getName)() ??
              "eldarya-enhancements"
            }-settings.json`
          )
          a.click()
        }

        /***/
      },

    /***/ "./src/ui/top_bar.ts":
      /*!***************************!*\
  !*** ./src/ui/top_bar.ts ***!
  \***************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadTopBar: () => /* binding */ loadTopBar,
          /* harmony export */
        })
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts"
          )
        /* harmony import */ var _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_2__ =
          __webpack_require__(
            /*! ../session_storage/session_storage */ "./src/session_storage/session_storage.ts"
          )
        /* harmony import */ var _takeover_brain__WEBPACK_IMPORTED_MODULE_3__ =
          __webpack_require__(
            /*! ../takeover/brain */ "./src/takeover/brain.ts"
          )

        function loadTopBar() {
          const headerRight = document.getElementById("header-right")
          if (!headerRight) return
          const headerTakeover = headerRight.querySelector("#header-takeover")
          if (headerTakeover) headerTakeover.remove()
          else loadLinks()
          if (
            (_local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__
              .LocalStorage.minigames ||
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__
                .LocalStorage.explorations ||
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__
                .LocalStorage.market) &&
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__
              .LocalStorage.unlocked
          ) {
            const template = __webpack_require__(
              /*! ../templates/html/header_takeover.html */ "./src/templates/html/header_takeover.html"
            )
            headerRight.insertAdjacentHTML(
              "afterbegin",
              template.render({
                takeover:
                  _session_storage_session_storage__WEBPACK_IMPORTED_MODULE_2__
                    .SessionStorage.takeover,
                translate:
                  _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate,
              })
            )
            headerRight
              .querySelector("#header-takeover")
              ?.addEventListener(
                "click",
                _takeover_brain__WEBPACK_IMPORTED_MODULE_3__.toggleTakeover
              )
          }
        }
        function loadLinks() {
          const headerProfile =
            document.getElementById("header-profile")?.firstChild
          if (headerProfile?.textContent) {
            const a = document.createElement("a")
            a.href = "/player/profile"
            a.style.color = "var(--text-color)"
            a.style.fontFamily = '"Alegreya Sans", sans-serif'
            a.style.fontWeight = "unset"
            a.textContent = headerProfile.textContent.trim()
            const p = document.createElement("p")
            p.insertAdjacentElement("beforeend", a)
            headerProfile.replaceWith(p)
          }
          const avatarTitle = document.querySelector(
            "#avatar-menu-container-outer>p"
          )
          if (avatarTitle?.textContent)
            avatarTitle.innerHTML = `<a href="/player/profile" style="color: #FFFFFF; font-size: 23px; font-weight: 900; text-transform: uppercase;">${avatarTitle.textContent.trim()}</a>`
          document
            .querySelector("#avatar-menu-container>canvas")
            ?.addEventListener("click", () => pageLoad("/player/appearance"))
        }

        /***/
      },

    /***/ "./src/ui/wishlist.ts":
      /*!****************************!*\
  !*** ./src/ui/wishlist.ts ***!
  \****************************/
      /***/ (
        __unused_webpack_module,
        __webpack_exports__,
        __webpack_require__
      ) => {
        "use strict"
        __webpack_require__.r(__webpack_exports__)
        /* harmony export */ __webpack_require__.d(__webpack_exports__, {
          /* harmony export */ loadWishlist: () => /* binding */ loadWishlist,
          /* harmony export */
        })
        /* harmony import */ var _i18n_translate__WEBPACK_IMPORTED_MODULE_0__ =
          __webpack_require__(
            /*! ../i18n/translate */ "./src/i18n/translate.ts"
          )
        /* harmony import */ var _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__ =
          __webpack_require__(
            /*! ../local_storage/local_storage */ "./src/local_storage/local_storage.ts"
          )

        function loadWishlist() {
          const marketplaceMenu = document.getElementById("marketplace-menu")
          if (!marketplaceMenu) return
          if (!marketplaceMenu.querySelector("#wishlist-button")) {
            for (const a of marketplaceMenu.querySelectorAll("a")) {
              a.addEventListener("click", () =>
                pageLoad(a.href, undefined, undefined, undefined, true)
              )
            }
          }
          marketplaceMenu.querySelector("#wishlist-button")?.remove()
          const wishlistButtonTemplate = __webpack_require__(
            /*! ../templates/html/wishlist_button.html */ "./src/templates/html/wishlist_button.html"
          )
          marketplaceMenu.insertAdjacentHTML(
            "beforeend",
            wishlistButtonTemplate.render({
              translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate,
            })
          )
          const wishlistButton =
            marketplaceMenu.querySelector("#wishlist-button")
          wishlistButton?.addEventListener("click", () =>
            insertWishlist(wishlistButton)
          )
        }
        function insertWishlist(button) {
          // Assistance
          const assistance = document.querySelector(".marketplace-assistance")
          if (assistance)
            assistance.innerHTML =
              _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.market.wishlist.assistance
          // Menu
          document
            .querySelector("#marketplace-menu .active")
            ?.classList.remove("active")
          button.classList.add("active")
          // Filters
          const filters = document.getElementById("marketplace-filters")
          if (filters) filters.innerHTML = ""
          // Content
          const wishlistTemplate = __webpack_require__(
            /*! ../templates/html/wishlist_settings.html */ "./src/templates/html/wishlist_settings.html"
          )
          const container =
            document.querySelector(".marketplace-container") ??
            document.getElementById("marketplace-active-auctions") ??
            document.getElementById("marketplace-itemsForSale")
          if (!container) return
          const wishlistContext = {
            wishlist:
              _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__
                .LocalStorage.wishlist,
          }
          container.innerHTML = wishlistTemplate.render({
            ...wishlistContext,
            translate: _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate,
          })
          // Buttons
          for (const tr of container.querySelectorAll("tr")) {
            const icon = tr.dataset.icon
            if (!icon) continue
            // Reset status
            const reset = tr.querySelector(".reset-item-status")
            if (reset)
              reset.addEventListener("click", () => {
                resetStatus(icon)
                insertWishlist(button)
              })
            // Delete item from wishlist
            const deleteButton = tr.querySelector(".delete-wishlist-item")
            if (deleteButton)
              deleteButton.addEventListener("click", () => {
                deleteItem(icon)
                insertWishlist(button)
              })
            // Change price
            const editPrice = tr.querySelector(".edit-price")
            if (editPrice)
              editPrice.addEventListener(
                "click",
                () => void changePrice(icon).then(() => insertWishlist(button))
              )
          }
        }
        function resetStatus(icon) {
          const wishlist =
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__
              .LocalStorage.wishlist
          const index = wishlist.findIndex(item => item.icon === icon)
          const entry = wishlist[index]
          if (!entry) return
          delete entry.error
          _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.wishlist =
            [
              ...wishlist.slice(undefined, index),
              entry,
              ...wishlist.slice(index + 1, undefined),
            ]
        }
        function deleteItem(icon) {
          _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.wishlist =
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.wishlist.filter(
              item => item.icon !== icon
            )
        }
        async function changePrice(icon) {
          const template = __webpack_require__(
            /*! ../templates/html/change_price_flavr.html */ "./src/templates/html/change_price_flavr.html"
          )
          const wishlist =
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__
              .LocalStorage.wishlist
          const index = wishlist.findIndex(item => item.icon === icon)
          const entry = wishlist[index]
          if (!entry) return
          return new Promise(resolve => {
            $.flavr({
              content: template.render({
                translate:
                  _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate,
              }),
              dialog: "prompt",
              prompt: {
                value: entry.price.toString(),
              },
              buttons: {
                close: {
                  style: "close",
                  action: () => {
                    resolve()
                    return true
                  },
                },
                save: {
                  action: () => save(icon, resolve),
                },
              },
              onBuild: $container => {
                $container.addClass("new-layout-popup")
                document
                  .querySelector(".flavr-prompt")
                  ?.addEventListener("keyup", ({ key }) => {
                    if (key !== "Enter") return
                    save(icon, resolve)
                  })
              },
            })
          })
        }
        function save(icon, resolve) {
          const wishlist =
            _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__
              .LocalStorage.wishlist
          const index = wishlist.findIndex(item => item.icon === icon)
          const entry = wishlist[index]
          if (!entry) return false
          const price = Number(
            document.querySelector(".flavr-prompt")?.value.trim()
          )
          if (!price || price <= 0) {
            $.flavrNotif(
              _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.market
                .change_price.invalid_price
            )
            return false
          }
          entry.price = price
          _local_storage_local_storage__WEBPACK_IMPORTED_MODULE_1__.LocalStorage.wishlist =
            [
              ...wishlist.slice(undefined, index),
              entry,
              ...wishlist.slice(index + 1, undefined),
            ]
          const template = __webpack_require__(
            /*! ../templates/html/flavr_notif/icon_message.html */ "./src/templates/html/flavr_notif/icon_message.html"
          )
          $.flavrNotif(
            template.render({
              ...entry,
              message:
                _i18n_translate__WEBPACK_IMPORTED_MODULE_0__.translate.market.change_price.changed_price(
                  entry.name,
                  entry.price
                ),
            })
          )
          resolve()
          return true
        }

        /***/
      },

    /******/
  }
  /************************************************************************/
  /******/ // The module cache
  /******/ var __webpack_module_cache__ = {}
  /******/
  /******/ // The require function
  /******/ function __webpack_require__(moduleId) {
    /******/ // Check if module is in cache
    /******/ var cachedModule = __webpack_module_cache__[moduleId]
    /******/ if (cachedModule !== undefined) {
      /******/ return cachedModule.exports
      /******/
    }
    /******/ // Create a new module (and put it into the cache)
    /******/ var module = (__webpack_module_cache__[moduleId] = {
      /******/ // no module.id needed
      /******/ // no module.loaded needed
      /******/ exports: {},
      /******/
    })
    /******/
    /******/ // Execute the module function
    /******/ __webpack_modules__[moduleId](
      module,
      module.exports,
      __webpack_require__
    )
    /******/
    /******/ // Return the exports of the module
    /******/ return module.exports
    /******/
  }
  /******/
  /************************************************************************/
  /******/ /* webpack/runtime/compat get default export */
  /******/ ;(() => {
    /******/ // getDefaultExport function for compatibility with non-harmony modules
    /******/ __webpack_require__.n = module => {
      /******/ var getter =
        module && module.__esModule
          ? /******/ () => module["default"]
          : /******/ () => module
      /******/ __webpack_require__.d(getter, { a: getter })
      /******/ return getter
      /******/
    }
    /******/
  })()
  /******/
  /******/ /* webpack/runtime/define property getters */
  /******/ ;(() => {
    /******/ // define getter functions for harmony exports
    /******/ __webpack_require__.d = (exports, definition) => {
      /******/ for (var key in definition) {
        /******/ if (
          __webpack_require__.o(definition, key) &&
          !__webpack_require__.o(exports, key)
        ) {
          /******/ Object.defineProperty(exports, key, {
            enumerable: true,
            get: definition[key],
          })
          /******/
        }
        /******/
      }
      /******/
    }
    /******/
  })()
  /******/
  /******/ /* webpack/runtime/hasOwnProperty shorthand */
  /******/ ;(() => {
    /******/ __webpack_require__.o = (obj, prop) =>
      Object.prototype.hasOwnProperty.call(obj, prop)
    /******/
  })()
  /******/
  /******/ /* webpack/runtime/make namespace object */
  /******/ ;(() => {
    /******/ // define __esModule on exports
    /******/ __webpack_require__.r = exports => {
      /******/ if (typeof Symbol !== "undefined" && Symbol.toStringTag) {
        /******/ Object.defineProperty(exports, Symbol.toStringTag, {
          value: "Module",
        })
        /******/
      }
      /******/ Object.defineProperty(exports, "__esModule", { value: true })
      /******/
    }
    /******/
  })()
  /******/
  /************************************************************************/
  var __webpack_exports__ = {}
  // This entry need to be wrapped in an IIFE because it need to be in strict mode.
  ;(() => {
    "use strict"
    /*!*********************!*\
  !*** ./src/main.ts ***!
  \*********************/
    __webpack_require__.r(__webpack_exports__)
    /* harmony import */ var _appearance_dressing_experience__WEBPACK_IMPORTED_MODULE_0__ =
      __webpack_require__(
        /*! ./appearance/dressing_experience */ "./src/appearance/dressing_experience.ts"
      )
    /* harmony import */ var _cheat_codes__WEBPACK_IMPORTED_MODULE_1__ =
      __webpack_require__(/*! ./cheat_codes */ "./src/cheat_codes.ts")
    /* harmony import */ var _migrate__WEBPACK_IMPORTED_MODULE_2__ =
      __webpack_require__(/*! ./migrate */ "./src/migrate.ts")
    /* harmony import */ var _takeover_brain__WEBPACK_IMPORTED_MODULE_3__ =
      __webpack_require__(/*! ./takeover/brain */ "./src/takeover/brain.ts")
    /* harmony import */ var _ui_auctions__WEBPACK_IMPORTED_MODULE_4__ =
      __webpack_require__(/*! ./ui/auctions */ "./src/ui/auctions.ts")
    /* harmony import */ var _ui_carousel__WEBPACK_IMPORTED_MODULE_5__ =
      __webpack_require__(/*! ./ui/carousel */ "./src/ui/carousel.ts")
    /* harmony import */ var _ui_favourites__WEBPACK_IMPORTED_MODULE_6__ =
      __webpack_require__(/*! ./ui/favourites */ "./src/ui/favourites.ts")
    /* harmony import */ var _ui_home_content__WEBPACK_IMPORTED_MODULE_7__ =
      __webpack_require__(/*! ./ui/home_content */ "./src/ui/home_content.ts")
    /* harmony import */ var _ui_mall__WEBPACK_IMPORTED_MODULE_8__ =
      __webpack_require__(/*! ./ui/mall */ "./src/ui/mall.ts")
    /* harmony import */ var _ui_market__WEBPACK_IMPORTED_MODULE_9__ =
      __webpack_require__(/*! ./ui/market */ "./src/ui/market.ts")
    /* harmony import */ var _ui_menu__WEBPACK_IMPORTED_MODULE_10__ =
      __webpack_require__(/*! ./ui/menu */ "./src/ui/menu.ts")
    /* harmony import */ var _ui_pet__WEBPACK_IMPORTED_MODULE_11__ =
      __webpack_require__(/*! ./ui/pet */ "./src/ui/pet.ts")
    /* harmony import */ var _ui_profile__WEBPACK_IMPORTED_MODULE_12__ =
      __webpack_require__(/*! ./ui/profile */ "./src/ui/profile.ts")
    /* harmony import */ var _ui_purro_shop__WEBPACK_IMPORTED_MODULE_13__ =
      __webpack_require__(/*! ./ui/purro_shop */ "./src/ui/purro_shop.ts")
    /* harmony import */ var _ui_settings__WEBPACK_IMPORTED_MODULE_14__ =
      __webpack_require__(/*! ./ui/settings */ "./src/ui/settings.ts")
    /* harmony import */ var _ui_top_bar__WEBPACK_IMPORTED_MODULE_15__ =
      __webpack_require__(/*! ./ui/top_bar */ "./src/ui/top_bar.ts")
    /* harmony import */ var _ui_wishlist__WEBPACK_IMPORTED_MODULE_16__ =
      __webpack_require__(/*! ./ui/wishlist */ "./src/ui/wishlist.ts")

    // loadJS("https://unpkg.com/hogan.js/dist/template-3.0.2.min.js", true);
    function load() {
      loadUI()
      ;(0, _takeover_brain__WEBPACK_IMPORTED_MODULE_3__.loadTakeover)()
    }
    function loadUI() {
      ;(0, _ui_menu__WEBPACK_IMPORTED_MODULE_10__.loadMenu)()
      ;(0, _ui_carousel__WEBPACK_IMPORTED_MODULE_5__.loadCarousel)()
      ;(0, _ui_home_content__WEBPACK_IMPORTED_MODULE_7__.loadHomeContent)()
      ;(0, _ui_favourites__WEBPACK_IMPORTED_MODULE_6__.loadFavourites)()
      ;(0, _ui_profile__WEBPACK_IMPORTED_MODULE_12__.loadProfile)()
      ;(0, _ui_pet__WEBPACK_IMPORTED_MODULE_11__.loadPet)()
      ;(0, _ui_market__WEBPACK_IMPORTED_MODULE_9__.loadMarket)()
      ;(0, _ui_wishlist__WEBPACK_IMPORTED_MODULE_16__.loadWishlist)()
      ;(0, _ui_top_bar__WEBPACK_IMPORTED_MODULE_15__.loadTopBar)()
      ;(0, _ui_auctions__WEBPACK_IMPORTED_MODULE_4__.loadAuctions)()
      ;(0, _ui_purro_shop__WEBPACK_IMPORTED_MODULE_13__.loadPurroShop)()
      ;(0, _ui_mall__WEBPACK_IMPORTED_MODULE_8__.loadMall)()
      ;(0, _cheat_codes__WEBPACK_IMPORTED_MODULE_1__.loadCheatCodes)()
      // Eldarya is crashing when opening groups.
      // TODO: Handle errors and stop the loading process.
      void (0,
      _appearance_dressing_experience__WEBPACK_IMPORTED_MODULE_0__.loadDressingExperience)()
      if (document.readyState === "complete") void loadIndexedDb()
      else window.addEventListener("load", () => loadIndexedDb())
    }
    function loadIndexedDb() {
      void (0, _ui_settings__WEBPACK_IMPORTED_MODULE_14__.loadSettings)()
    }
    new MutationObserver(load).observe(document.getElementById("container"), {
      childList: true,
    })
    ;(0, _migrate__WEBPACK_IMPORTED_MODULE_2__.migrate)()
    loadUI()
    console.log(`${GM.info.script.name} v${GM.info.script.version} loaded.`)
    ;(0, _takeover_brain__WEBPACK_IMPORTED_MODULE_3__.loadTakeover)()
  })()

  /******/
})()
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkYXJ5YS1lbmhhbmNlbWVudHMudXNlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsbUJBQW1CO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxvQkFBb0I7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsb0JBQW9CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGtCQUFrQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsWUFBWTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBLGdDQUFnQyxZQUFZO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFK1M7Ozs7Ozs7Ozs7O0FDbGIvUztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFD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QyxXQUFXLENBQVMsRUFDNUM7SUFDRSxTQUFTLEVBQUUsSUFBSTtDQUNoQixDQUNGO0FBRUQsaURBQU8sRUFBRTtBQUVULE1BQU0sRUFBRTtBQUNSLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxVQUFVLENBQUM7QUFDeEUsNkRBQVksRUFBRSIsInNvdXJjZXMiOlsid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vbm9kZV9tb2R1bGVzLy5wbnBtL2Jsb2ItdXRpbEAyLjAuMi9ub2RlX21vZHVsZXMvYmxvYi11dGlsL2Rpc3QvYmxvYi11dGlsLmVzLmpzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vbm9kZV9tb2R1bGVzLy5wbnBtL2hvZ2FuLmpzQDMuMC4yL25vZGVfbW9kdWxlcy9ob2dhbi5qcy9saWIvY29tcGlsZXIuanMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9ub2RlX21vZHVsZXMvLnBucG0vaG9nYW4uanNAMy4wLjIvbm9kZV9tb2R1bGVzL2hvZ2FuLmpzL2xpYi9ob2dhbi5qcyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL25vZGVfbW9kdWxlcy8ucG5wbS9ob2dhbi5qc0AzLjAuMi9ub2RlX21vZHVsZXMvaG9nYW4uanMvbGliL3RlbXBsYXRlLmpzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2FwcGVhcmFuY2VfaXRlbS5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2FwcGVhcmFuY2VfaXRlbXNfY2F0ZWdvcnkuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9hcHBlYXJhbmNlX2l0ZW1zX2dyb3VwLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvYXV0b19idXlfYnV0dG9uLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvYXV0b19idXlfZmxhdnIuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9hdXRvX2J1eV9mbGF2cl9tYWxsLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvYXV0b19leHBsb3JlX2J1dHRvbi5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2Nhcm91c2VsX25ld3MuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9jaGFuZ2VfcHJpY2VfZmxhdnIuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9jcmVhdGVkX291dGZpdF9mbGF2ci5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL2V4cGxvcmF0aW9uX2hpc3RvcnkuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9mYXZvdXJpdGVfb3V0Zml0X2ZsYXZyLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvZmF2b3VyaXRlc19hY3Rpb24uaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9mbGF2cl9ub3RpZi9pY29uX21lc3NhZ2UuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9oZWFkZXJfdGFrZW92ZXIuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9ob21lX2NvbnRlbnRfc21hbGwuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9tYWluX21lbnUuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9tYWluX21lbnVfcHVycm9zaG9wLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvbWFya2V0X2hpc3RvcnkuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90ZW1wbGF0ZXMvaHRtbC9vdXRmaXRfdGh1bWJzLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvcHJvZmlsZV9jb250YWN0X2FjdGlvbi5odG1sIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3RlbXBsYXRlcy9odG1sL3NldHRpbmdzLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvd2lzaGxpc3RfYnV0dG9uLmh0bWwiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGVtcGxhdGVzL2h0bWwvd2lzaGxpc3Rfc2V0dGluZ3MuaHRtbCIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9hamF4L2FqYXhfc2VhcmNoLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2FqYXgvYnV5LnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2FqYXgvY2FwdHVyZV9lbmQudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvYWpheC9jaGFuZ2VfcmVnaW9uLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2FqYXgvZXhwbG9yYXRpb25fcmVzdWx0cy50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9hcGkvbWV0YS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9hcGkvcmVzdWx0LmVudW0udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvYXBwZWFyYW5jZS9hcHBlYXJhbmNlX3VpLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2FwcGVhcmFuY2UvZGF0YV9zZXQudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvYXBwZWFyYW5jZS9kcmVzc2luZ19leHBlcmllbmNlLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2FwcGVhcmFuY2UvZW51bXMvYXBwZWFyYW5jZV9jYXRlZ29yeV9jb2RlLmVudW0udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvYXBwZWFyYW5jZS9mYWtlX2Zhdm91cml0ZXMudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvYXBwZWFyYW5jZS9mYXZvdXJpdGVzX2FjdGlvbnMudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvYXBwZWFyYW5jZS9oaWRkZW4udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvYXBwZWFyYW5jZS93YXJkcm9iZS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9jYXJvdXNlbC9jYXJvdXNlbF9iZWVtb292X2Fubm95YW5jZXMudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvY2Fyb3VzZWwvY2Fyb3VzZWxfZG93bmxvYWRfZmFjZS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9jYXJvdXNlbC9jYXJvdXNlbF9kb3dubG9hZF9ndWFyZGlhbi50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9jYXJvdXNlbC9jYXJvdXNlbF9lbGRhcnlhX2VuaGFuY2VtZW50cy50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9jYXJvdXNlbC9jYXJvdXNlbF90YWtlb3Zlci50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9jaGVhdF9jb2Rlcy50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9jb25zb2xlLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2Rvd25sb2FkLWNhbnZhcy50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9kdXJhdGlvbi50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9lbGRhcnlhL2pxdWVyeS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9lbGRhcnlhX3V0aWwudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvaTE4bi9lbi50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9pMThuL2ZyLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2kxOG4vdHJhbnNsYXRlLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL2luZGV4ZWRfZGIvZGF0YWJhc2VzLmVudW0udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvaW5kZXhlZF9kYi9maWVsZHMuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9pbmRleGVkX2RiL2luZGV4ZWRfZGIudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvaW5kZXhlZF9kYi90YWJsZXMuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2UuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2UudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvbWFya2V0cGxhY2UvZW51bXMvYm9keV9sb2NhdGlvbi5lbnVtLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL21hcmtldHBsYWNlL2VudW1zL2NhdGVnb3J5LmVudW0udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvbWFya2V0cGxhY2UvZW51bXMvZ3VhcmQuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9tYXJrZXRwbGFjZS9lbnVtcy9yYXJpdHkuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9tYXJrZXRwbGFjZS9lbnVtcy90eXBlLmVudW0udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2VfaGFuZGxlcnMudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvbWF0aF91dGlsLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL21pZ3JhdGUudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvbWluaWdhbWVzL2VtaWxlLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL21pbmlnYW1lcy9mbGFwcHkudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvbWluaWdhbWVzL2hhdGNobGluZ3MudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvbWluaWdhbWVzL3BlZ2dsZS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9vdXRmaXQudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvcGV0L2V4cGxvcmF0aW9uLWhpc3RvcnkudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvcGV0L2V4cGxvcmF0aW9uLXdhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvcGV0L2V4cGxvcmF0aW9uLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3Nlc3Npb25fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2UuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy9zZXNzaW9uX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3Nlc3Npb25fc3RvcmFnZS90YWtlb3Zlcl9hY3Rpb24uZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90YWtlb3Zlci9icmFpbi50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90YWtlb3Zlci9jbGFzc2VzL2FjdGlvbi50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90YWtlb3Zlci9jbGFzc2VzL2J1eV9hY3Rpb24udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGFrZW92ZXIvY2xhc3Nlcy9kYWlseV9hY3Rpb24udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGFrZW92ZXIvY2xhc3Nlcy9leHBsb3JhdGlvbl9hY3Rpb24udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGFrZW92ZXIvY2xhc3Nlcy9taW5pZ2FtZV9hY3Rpb24udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGFrZW92ZXIvY2xhc3Nlcy9zdW1tZXJfZ2FtZV9hY3Rpb24udHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdGFrZW92ZXIvY2xhc3Nlcy93YWl0X2FjdGlvbi50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90YWtlb3Zlci9jbGljay50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90YWtlb3Zlci9leHBsb3JhdGlvbl9zdGF0dXMuZW51bS50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy90c191dGlsLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3VpL2F1Y3Rpb25zLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3VpL2Nhcm91c2VsLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3VpL2Zhdm91cml0ZXMudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdWkvaG9tZV9jb250ZW50LnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3VpL21hbGwudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdWkvbWFya2V0LnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3VpL21lbnUudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdWkvcGV0LnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3VpL3Byb2ZpbGUudHMiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvdWkvcHVycm9fc2hvcC50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy91aS9zZXR0aW5ncy50cyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy8uL3NyYy91aS90b3BfYmFyLnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy4vc3JjL3VpL3dpc2hsaXN0LnRzIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9lbGRhcnlhLWVuaGFuY2VtZW50cy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL2VsZGFyeWEtZW5oYW5jZW1lbnRzL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLi9zcmMvbWFpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUT0RPOiBpbmNsdWRpbmcgdGhlc2UgaW4gYmxvYi11dGlsLnRzIGNhdXNlcyB0eXBlZG9jIHRvIGdlbmVyYXRlIGRvY3MgZm9yIHRoZW0sXG4vLyBldmVuIHdpdGggLS1leGNsdWRlUHJpdmF0ZSDCr1xcXyjjg4QpXy/Cr1xuLyoqIEBwcml2YXRlICovXG5mdW5jdGlvbiBsb2FkSW1hZ2Uoc3JjLCBjcm9zc09yaWdpbikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgaWYgKGNyb3NzT3JpZ2luKSB7XG4gICAgICAgICAgICBpbWcuY3Jvc3NPcmlnaW4gPSBjcm9zc09yaWdpbjtcbiAgICAgICAgfVxuICAgICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmVzb2x2ZShpbWcpO1xuICAgICAgICB9O1xuICAgICAgICBpbWcub25lcnJvciA9IHJlamVjdDtcbiAgICAgICAgaW1nLnNyYyA9IHNyYztcbiAgICB9KTtcbn1cbi8qKiBAcHJpdmF0ZSAqL1xuZnVuY3Rpb24gaW1nVG9DYW52YXMoaW1nKSB7XG4gICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcbiAgICAvLyBjb3B5IHRoZSBpbWFnZSBjb250ZW50cyB0byB0aGUgY2FudmFzXG4gICAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDAsIGltZy53aWR0aCwgaW1nLmhlaWdodCwgMCwgMCwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KTtcbiAgICByZXR1cm4gY2FudmFzO1xufVxuXG4vKiBnbG9iYWwgUHJvbWlzZSwgSW1hZ2UsIEJsb2IsIEZpbGVSZWFkZXIsIGF0b2IsIGJ0b2EsXG4gICBCbG9iQnVpbGRlciwgTVNCbG9iQnVpbGRlciwgTW96QmxvYkJ1aWxkZXIsIFdlYktpdEJsb2JCdWlsZGVyLCB3ZWJraXRVUkwgKi9cbi8qKlxuICogU2hpbSBmb3JcbiAqIFtgbmV3IEJsb2IoKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9CbG9iLkJsb2IpXG4gKiB0byBzdXBwb3J0XG4gKiBbb2xkZXIgYnJvd3NlcnMgdGhhdCB1c2UgdGhlIGRlcHJlY2F0ZWQgYEJsb2JCdWlsZGVyYCBBUEldKGh0dHA6Ly9jYW5pdXNlLmNvbS9ibG9iKS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgbXlCbG9iID0gYmxvYlV0aWwuY3JlYXRlQmxvYihbJ2hlbGxvIHdvcmxkJ10sIHt0eXBlOiAndGV4dC9wbGFpbid9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwYXJ0cyAtIGNvbnRlbnQgb2YgdGhlIEJsb2JcbiAqIEBwYXJhbSBwcm9wZXJ0aWVzIC0gdXN1YWxseSBge3R5cGU6IG15Q29udGVudFR5cGV9YCxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgeW91IGNhbiBhbHNvIHBhc3MgYSBzdHJpbmcgZm9yIHRoZSBjb250ZW50IHR5cGVcbiAqIEByZXR1cm5zIEJsb2JcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmxvYihwYXJ0cywgcHJvcGVydGllcykge1xuICAgIHBhcnRzID0gcGFydHMgfHwgW107XG4gICAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMgfHwge307XG4gICAgaWYgKHR5cGVvZiBwcm9wZXJ0aWVzID09PSAnc3RyaW5nJykge1xuICAgICAgICBwcm9wZXJ0aWVzID0geyB0eXBlOiBwcm9wZXJ0aWVzIH07IC8vIGluZmVyIGNvbnRlbnQgdHlwZVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2IocGFydHMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZS5uYW1lICE9PSAnVHlwZUVycm9yJykge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgQnVpbGRlciA9IHR5cGVvZiBCbG9iQnVpbGRlciAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgID8gQmxvYkJ1aWxkZXIgOiB0eXBlb2YgTVNCbG9iQnVpbGRlciAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgID8gTVNCbG9iQnVpbGRlciA6IHR5cGVvZiBNb3pCbG9iQnVpbGRlciAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgID8gTW96QmxvYkJ1aWxkZXIgOiBXZWJLaXRCbG9iQnVpbGRlcjtcbiAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChwYXJ0c1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0QmxvYihwcm9wZXJ0aWVzLnR5cGUpO1xuICAgIH1cbn1cbi8qKlxuICogU2hpbSBmb3JcbiAqIFtgVVJMLmNyZWF0ZU9iamVjdFVSTCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1VSTC5jcmVhdGVPYmplY3RVUkwpXG4gKiB0byBzdXBwb3J0IGJyb3dzZXJzIHRoYXQgb25seSBoYXZlIHRoZSBwcmVmaXhlZFxuICogYHdlYmtpdFVSTGAgKGUuZy4gQW5kcm9pZCA8NC40KS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgbXlVcmwgPSBibG9iVXRpbC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYmxvYlxuICogQHJldHVybnMgdXJsXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTChibG9iKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgVVJMICE9PSAndW5kZWZpbmVkJyA/IFVSTCA6IHdlYmtpdFVSTCkuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xufVxuLyoqXG4gKiBTaGltIGZvclxuICogW2BVUkwucmV2b2tlT2JqZWN0VVJMKClgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVVJMLnJldm9rZU9iamVjdFVSTClcbiAqIHRvIHN1cHBvcnQgYnJvd3NlcnMgdGhhdCBvbmx5IGhhdmUgdGhlIHByZWZpeGVkXG4gKiBgd2Via2l0VVJMYCAoZS5nLiBBbmRyb2lkIDw0LjQpLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGJsb2JVdGlsLnJldm9rZU9iamVjdFVSTChteVVybCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdXJsXG4gKi9cbmZ1bmN0aW9uIHJldm9rZU9iamVjdFVSTCh1cmwpIHtcbiAgICByZXR1cm4gKHR5cGVvZiBVUkwgIT09ICd1bmRlZmluZWQnID8gVVJMIDogd2Via2l0VVJMKS5yZXZva2VPYmplY3RVUkwodXJsKTtcbn1cbi8qKlxuICogQ29udmVydCBhIGBCbG9iYCB0byBhIGJpbmFyeSBzdHJpbmcuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogYmxvYlV0aWwuYmxvYlRvQmluYXJ5U3RyaW5nKGJsb2IpLnRoZW4oZnVuY3Rpb24gKGJpbmFyeVN0cmluZykge1xuICogICAvLyBzdWNjZXNzXG4gKiB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gKiAgIC8vIGVycm9yXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBibG9iXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmluYXJ5IHN0cmluZ1xuICovXG5mdW5jdGlvbiBibG9iVG9CaW5hcnlTdHJpbmcoYmxvYikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICB2YXIgaGFzQmluYXJ5U3RyaW5nID0gdHlwZW9mIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcgPT09ICdmdW5jdGlvbic7XG4gICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVhZGVyLnJlc3VsdCB8fCAnJztcbiAgICAgICAgICAgIGlmIChoYXNCaW5hcnlTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShhcnJheUJ1ZmZlclRvQmluYXJ5U3RyaW5nKHJlc3VsdCkpO1xuICAgICAgICB9O1xuICAgICAgICByZWFkZXIub25lcnJvciA9IHJlamVjdDtcbiAgICAgICAgaWYgKGhhc0JpbmFyeVN0cmluZykge1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhibG9iKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqXG4gKiBDb252ZXJ0IGEgYmFzZTY0LWVuY29kZWQgc3RyaW5nIHRvIGEgYEJsb2JgLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciBibG9iID0gYmxvYlV0aWwuYmFzZTY0U3RyaW5nVG9CbG9iKGJhc2U2NFN0cmluZyk7XG4gKiBgYGBcbiAqIEBwYXJhbSBiYXNlNjQgLSBiYXNlNjQtZW5jb2RlZCBzdHJpbmdcbiAqIEBwYXJhbSB0eXBlIC0gdGhlIGNvbnRlbnQgdHlwZSAob3B0aW9uYWwpXG4gKiBAcmV0dXJucyBCbG9iXG4gKi9cbmZ1bmN0aW9uIGJhc2U2NFN0cmluZ1RvQmxvYihiYXNlNjQsIHR5cGUpIHtcbiAgICB2YXIgcGFydHMgPSBbYmluYXJ5U3RyaW5nVG9BcnJheUJ1ZmZlcihhdG9iKGJhc2U2NCkpXTtcbiAgICByZXR1cm4gdHlwZSA/IGNyZWF0ZUJsb2IocGFydHMsIHsgdHlwZTogdHlwZSB9KSA6IGNyZWF0ZUJsb2IocGFydHMpO1xufVxuLyoqXG4gKiBDb252ZXJ0IGEgYmluYXJ5IHN0cmluZyB0byBhIGBCbG9iYC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgYmxvYiA9IGJsb2JVdGlsLmJpbmFyeVN0cmluZ1RvQmxvYihiaW5hcnlTdHJpbmcpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGJpbmFyeSAtIGJpbmFyeSBzdHJpbmdcbiAqIEBwYXJhbSB0eXBlIC0gdGhlIGNvbnRlbnQgdHlwZSAob3B0aW9uYWwpXG4gKiBAcmV0dXJucyBCbG9iXG4gKi9cbmZ1bmN0aW9uIGJpbmFyeVN0cmluZ1RvQmxvYihiaW5hcnksIHR5cGUpIHtcbiAgICByZXR1cm4gYmFzZTY0U3RyaW5nVG9CbG9iKGJ0b2EoYmluYXJ5KSwgdHlwZSk7XG59XG4vKipcbiAqIENvbnZlcnQgYSBgQmxvYmAgdG8gYSBiaW5hcnkgc3RyaW5nLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGJsb2JVdGlsLmJsb2JUb0Jhc2U2NFN0cmluZyhibG9iKS50aGVuKGZ1bmN0aW9uIChiYXNlNjRTdHJpbmcpIHtcbiAqICAgLy8gc3VjY2Vzc1xuICogfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICogICAvLyBlcnJvclxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYmxvYlxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJpbmFyeSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gYmxvYlRvQmFzZTY0U3RyaW5nKGJsb2IpIHtcbiAgICByZXR1cm4gYmxvYlRvQmluYXJ5U3RyaW5nKGJsb2IpLnRoZW4oYnRvYSk7XG59XG4vKipcbiAqIENvbnZlcnQgYSBkYXRhIFVSTCBzdHJpbmdcbiAqIChlLmcuIGAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLRy4uLidgKVxuICogdG8gYSBgQmxvYmAuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogdmFyIGJsb2IgPSBibG9iVXRpbC5kYXRhVVJMVG9CbG9iKGRhdGFVUkwpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGRhdGFVUkwgLSBkYXRhVVJMLWVuY29kZWQgc3RyaW5nXG4gKiBAcmV0dXJucyBCbG9iXG4gKi9cbmZ1bmN0aW9uIGRhdGFVUkxUb0Jsb2IoZGF0YVVSTCkge1xuICAgIHZhciB0eXBlID0gZGF0YVVSTC5tYXRjaCgvZGF0YTooW147XSspLylbMV07XG4gICAgdmFyIGJhc2U2NCA9IGRhdGFVUkwucmVwbGFjZSgvXlteLF0rLC8sICcnKTtcbiAgICB2YXIgYnVmZiA9IGJpbmFyeVN0cmluZ1RvQXJyYXlCdWZmZXIoYXRvYihiYXNlNjQpKTtcbiAgICByZXR1cm4gY3JlYXRlQmxvYihbYnVmZl0sIHsgdHlwZTogdHlwZSB9KTtcbn1cbi8qKlxuICogQ29udmVydCBhIGBCbG9iYCB0byBhIGRhdGEgVVJMIHN0cmluZ1xuICogKGUuZy4gYCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHLi4uJ2ApLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciBkYXRhVVJMID0gYmxvYlV0aWwuYmxvYlRvRGF0YVVSTChibG9iKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBibG9iXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZGF0YSBVUkwgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGJsb2JUb0RhdGFVUkwoYmxvYikge1xuICAgIHJldHVybiBibG9iVG9CYXNlNjRTdHJpbmcoYmxvYikudGhlbihmdW5jdGlvbiAoYmFzZTY0U3RyaW5nKSB7XG4gICAgICAgIHJldHVybiAnZGF0YTonICsgYmxvYi50eXBlICsgJztiYXNlNjQsJyArIGJhc2U2NFN0cmluZztcbiAgICB9KTtcbn1cbi8qKlxuICogQ29udmVydCBhbiBpbWFnZSdzIGBzcmNgIFVSTCB0byBhIGRhdGEgVVJMIGJ5IGxvYWRpbmcgdGhlIGltYWdlIGFuZCBwYWludGluZ1xuICogaXQgdG8gYSBgY2FudmFzYC5cbiAqXG4gKiBOb3RlOiB0aGlzIHdpbGwgY29lcmNlIHRoZSBpbWFnZSB0byB0aGUgZGVzaXJlZCBjb250ZW50IHR5cGUsIGFuZCBpdFxuICogd2lsbCBvbmx5IHBhaW50IHRoZSBmaXJzdCBmcmFtZSBvZiBhbiBhbmltYXRlZCBHSUYuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogYGBganNcbiAqIGJsb2JVdGlsLmltZ1NyY1RvRGF0YVVSTCgnaHR0cDovL215c2l0ZS5jb20vaW1nLnBuZycpLnRoZW4oZnVuY3Rpb24gKGRhdGFVUkwpIHtcbiAqICAgLy8gc3VjY2Vzc1xuICogfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICogICAvLyBlcnJvclxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogYmxvYlV0aWwuaW1nU3JjVG9EYXRhVVJMKCdodHRwOi8vc29tZS1vdGhlci1zaXRlLmNvbS9pbWcuanBnJywgJ2ltYWdlL2pwZWcnLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICdBbm9ueW1vdXMnLCAxLjApLnRoZW4oZnVuY3Rpb24gKGRhdGFVUkwpIHtcbiAqICAgLy8gc3VjY2Vzc1xuICogfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICogICAvLyBlcnJvclxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc3JjIC0gaW1hZ2Ugc3JjXG4gKiBAcGFyYW0gdHlwZSAtIHRoZSBjb250ZW50IHR5cGUgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byAnaW1hZ2UvcG5nJylcbiAqIEBwYXJhbSBjcm9zc09yaWdpbiAtIGZvciBDT1JTLWVuYWJsZWQgaW1hZ2VzLCBzZXQgdGhpcyB0b1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBbm9ueW1vdXMnIHRvIGF2b2lkIFwidGFpbnRlZCBjYW52YXNcIiBlcnJvcnNcbiAqIEBwYXJhbSBxdWFsaXR5IC0gYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxIGluZGljYXRpbmcgaW1hZ2UgcXVhbGl0eVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIHJlcXVlc3RlZCB0eXBlIGlzICdpbWFnZS9qcGVnJyBvciAnaW1hZ2Uvd2VicCdcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBkYXRhIFVSTCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gaW1nU3JjVG9EYXRhVVJMKHNyYywgdHlwZSwgY3Jvc3NPcmlnaW4sIHF1YWxpdHkpIHtcbiAgICB0eXBlID0gdHlwZSB8fCAnaW1hZ2UvcG5nJztcbiAgICByZXR1cm4gbG9hZEltYWdlKHNyYywgY3Jvc3NPcmlnaW4pLnRoZW4oaW1nVG9DYW52YXMpLnRoZW4oZnVuY3Rpb24gKGNhbnZhcykge1xuICAgICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCh0eXBlLCBxdWFsaXR5KTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ29udmVydCBhIGBjYW52YXNgIHRvIGEgYEJsb2JgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqIGBgYGpzXG4gKiBibG9iVXRpbC5jYW52YXNUb0Jsb2IoY2FudmFzKS50aGVuKGZ1bmN0aW9uIChibG9iKSB7XG4gKiAgIC8vIHN1Y2Nlc3NcbiAqIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAqICAgLy8gZXJyb3JcbiAqIH0pO1xuICogYGBgXG4gKlxuICogTW9zdCBicm93c2VycyBzdXBwb3J0IGNvbnZlcnRpbmcgYSBjYW52YXMgdG8gYm90aCBgJ2ltYWdlL3BuZydgIGFuZCBgJ2ltYWdlL2pwZWcnYC4gWW91IG1heVxuICogYWxzbyB3YW50IHRvIHRyeSBgJ2ltYWdlL3dlYnAnYCwgd2hpY2ggd2lsbCB3b3JrIGluIHNvbWUgYnJvd3NlcnMgbGlrZSBDaHJvbWUgKGFuZCBpbiBvdGhlciBicm93c2Vycywgd2lsbCBqdXN0IGZhbGwgYmFjayB0byBgJ2ltYWdlL3BuZydgKTpcbiAqXG4gKiBgYGBqc1xuICogYmxvYlV0aWwuY2FudmFzVG9CbG9iKGNhbnZhcywgJ2ltYWdlL3dlYnAnKS50aGVuKGZ1bmN0aW9uIChibG9iKSB7XG4gKiAgIC8vIHN1Y2Nlc3NcbiAqIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAqICAgLy8gZXJyb3JcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGNhbnZhcyAtIEhUTUxDYW52YXNFbGVtZW50XG4gKiBAcGFyYW0gdHlwZSAtIHRoZSBjb250ZW50IHR5cGUgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byAnaW1hZ2UvcG5nJylcbiAqIEBwYXJhbSBxdWFsaXR5IC0gYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxIGluZGljYXRpbmcgaW1hZ2UgcXVhbGl0eVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIHJlcXVlc3RlZCB0eXBlIGlzICdpbWFnZS9qcGVnJyBvciAnaW1hZ2Uvd2VicCdcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBgQmxvYmBcbiAqL1xuZnVuY3Rpb24gY2FudmFzVG9CbG9iKGNhbnZhcywgdHlwZSwgcXVhbGl0eSkge1xuICAgIGlmICh0eXBlb2YgY2FudmFzLnRvQmxvYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIGNhbnZhcy50b0Jsb2IocmVzb2x2ZSwgdHlwZSwgcXVhbGl0eSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRhdGFVUkxUb0Jsb2IoY2FudmFzLnRvRGF0YVVSTCh0eXBlLCBxdWFsaXR5KSkpO1xufVxuLyoqXG4gKiBDb252ZXJ0IGFuIGltYWdlJ3MgYHNyY2AgVVJMIHRvIGEgYEJsb2JgIGJ5IGxvYWRpbmcgdGhlIGltYWdlIGFuZCBwYWludGluZ1xuICogaXQgdG8gYSBgY2FudmFzYC5cbiAqXG4gKiBOb3RlOiB0aGlzIHdpbGwgY29lcmNlIHRoZSBpbWFnZSB0byB0aGUgZGVzaXJlZCBjb250ZW50IHR5cGUsIGFuZCBpdFxuICogd2lsbCBvbmx5IHBhaW50IHRoZSBmaXJzdCBmcmFtZSBvZiBhbiBhbmltYXRlZCBHSUYuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogYGBganNcbiAqIGJsb2JVdGlsLmltZ1NyY1RvQmxvYignaHR0cDovL215c2l0ZS5jb20vaW1nLnBuZycpLnRoZW4oZnVuY3Rpb24gKGJsb2IpIHtcbiAqICAgLy8gc3VjY2Vzc1xuICogfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICogICAvLyBlcnJvclxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogYmxvYlV0aWwuaW1nU3JjVG9CbG9iKCdodHRwOi8vc29tZS1vdGhlci1zaXRlLmNvbS9pbWcuanBnJywgJ2ltYWdlL2pwZWcnLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICdBbm9ueW1vdXMnLCAxLjApLnRoZW4oZnVuY3Rpb24gKGJsb2IpIHtcbiAqICAgLy8gc3VjY2Vzc1xuICogfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICogICAvLyBlcnJvclxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc3JjIC0gaW1hZ2Ugc3JjXG4gKiBAcGFyYW0gdHlwZSAtIHRoZSBjb250ZW50IHR5cGUgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byAnaW1hZ2UvcG5nJylcbiAqIEBwYXJhbSBjcm9zc09yaWdpbiAtIGZvciBDT1JTLWVuYWJsZWQgaW1hZ2VzLCBzZXQgdGhpcyB0b1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBbm9ueW1vdXMnIHRvIGF2b2lkIFwidGFpbnRlZCBjYW52YXNcIiBlcnJvcnNcbiAqIEBwYXJhbSBxdWFsaXR5IC0gYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxIGluZGljYXRpbmcgaW1hZ2UgcXVhbGl0eVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIHJlcXVlc3RlZCB0eXBlIGlzICdpbWFnZS9qcGVnJyBvciAnaW1hZ2Uvd2VicCdcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBgQmxvYmBcbiAqL1xuZnVuY3Rpb24gaW1nU3JjVG9CbG9iKHNyYywgdHlwZSwgY3Jvc3NPcmlnaW4sIHF1YWxpdHkpIHtcbiAgICB0eXBlID0gdHlwZSB8fCAnaW1hZ2UvcG5nJztcbiAgICByZXR1cm4gbG9hZEltYWdlKHNyYywgY3Jvc3NPcmlnaW4pLnRoZW4oaW1nVG9DYW52YXMpLnRoZW4oZnVuY3Rpb24gKGNhbnZhcykge1xuICAgICAgICByZXR1cm4gY2FudmFzVG9CbG9iKGNhbnZhcywgdHlwZSwgcXVhbGl0eSk7XG4gICAgfSk7XG59XG4vKipcbiAqIENvbnZlcnQgYW4gYEFycmF5QnVmZmVyYCB0byBhIGBCbG9iYC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgYmxvYiA9IGJsb2JVdGlsLmFycmF5QnVmZmVyVG9CbG9iKGFycmF5QnVmZiwgJ2F1ZGlvL21wZWcnKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBidWZmZXJcbiAqIEBwYXJhbSB0eXBlIC0gdGhlIGNvbnRlbnQgdHlwZSAob3B0aW9uYWwpXG4gKiBAcmV0dXJucyBCbG9iXG4gKi9cbmZ1bmN0aW9uIGFycmF5QnVmZmVyVG9CbG9iKGJ1ZmZlciwgdHlwZSkge1xuICAgIHJldHVybiBjcmVhdGVCbG9iKFtidWZmZXJdLCB0eXBlKTtcbn1cbi8qKlxuICogQ29udmVydCBhIGBCbG9iYCB0byBhbiBgQXJyYXlCdWZmZXJgLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGJsb2JVdGlsLmJsb2JUb0FycmF5QnVmZmVyKGJsb2IpLnRoZW4oZnVuY3Rpb24gKGFycmF5QnVmZikge1xuICogICAvLyBzdWNjZXNzXG4gKiB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gKiAgIC8vIGVycm9yXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBibG9iXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYEFycmF5QnVmZmVyYFxuICovXG5mdW5jdGlvbiBibG9iVG9BcnJheUJ1ZmZlcihibG9iKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVhZGVyLnJlc3VsdCB8fCBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH07XG4gICAgICAgIHJlYWRlci5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYik7XG4gICAgfSk7XG59XG4vKipcbiAqIENvbnZlcnQgYW4gYEFycmF5QnVmZmVyYCB0byBhIGJpbmFyeSBzdHJpbmcuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogdmFyIG15U3RyaW5nID0gYmxvYlV0aWwuYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZyhhcnJheUJ1ZmYpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYnVmZmVyIC0gYXJyYXkgYnVmZmVyXG4gKiBAcmV0dXJucyBiaW5hcnkgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGFycmF5QnVmZmVyVG9CaW5hcnlTdHJpbmcoYnVmZmVyKSB7XG4gICAgdmFyIGJpbmFyeSA9ICcnO1xuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgdmFyIGxlbmd0aCA9IGJ5dGVzLmJ5dGVMZW5ndGg7XG4gICAgdmFyIGkgPSAtMTtcbiAgICB3aGlsZSAoKytpIDwgbGVuZ3RoKSB7XG4gICAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGJpbmFyeTtcbn1cbi8qKlxuICogQ29udmVydCBhIGJpbmFyeSBzdHJpbmcgdG8gYW4gYEFycmF5QnVmZmVyYC5cbiAqXG4gKiBgYGBqc1xuICogdmFyIG15QnVmZmVyID0gYmxvYlV0aWwuYmluYXJ5U3RyaW5nVG9BcnJheUJ1ZmZlcihiaW5hcnlTdHJpbmcpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYmluYXJ5IC0gYmluYXJ5IHN0cmluZ1xuICogQHJldHVybnMgYXJyYXkgYnVmZmVyXG4gKi9cbmZ1bmN0aW9uIGJpbmFyeVN0cmluZ1RvQXJyYXlCdWZmZXIoYmluYXJ5KSB7XG4gICAgdmFyIGxlbmd0aCA9IGJpbmFyeS5sZW5ndGg7XG4gICAgdmFyIGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihsZW5ndGgpO1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheShidWYpO1xuICAgIHZhciBpID0gLTE7XG4gICAgd2hpbGUgKCsraSA8IGxlbmd0aCkge1xuICAgICAgICBhcnJbaV0gPSBiaW5hcnkuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1Zjtcbn1cblxuZXhwb3J0IHsgY3JlYXRlQmxvYiwgY3JlYXRlT2JqZWN0VVJMLCByZXZva2VPYmplY3RVUkwsIGJsb2JUb0JpbmFyeVN0cmluZywgYmFzZTY0U3RyaW5nVG9CbG9iLCBiaW5hcnlTdHJpbmdUb0Jsb2IsIGJsb2JUb0Jhc2U2NFN0cmluZywgZGF0YVVSTFRvQmxvYiwgYmxvYlRvRGF0YVVSTCwgaW1nU3JjVG9EYXRhVVJMLCBjYW52YXNUb0Jsb2IsIGltZ1NyY1RvQmxvYiwgYXJyYXlCdWZmZXJUb0Jsb2IsIGJsb2JUb0FycmF5QnVmZmVyLCBhcnJheUJ1ZmZlclRvQmluYXJ5U3RyaW5nLCBiaW5hcnlTdHJpbmdUb0FycmF5QnVmZmVyIH07XG4iLCIvKlxuICogIENvcHlyaWdodCAyMDExIFR3aXR0ZXIsIEluYy5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbihmdW5jdGlvbiAoSG9nYW4pIHtcbiAgLy8gU2V0dXAgcmVnZXggIGFzc2lnbm1lbnRzXG4gIC8vIHJlbW92ZSB3aGl0ZXNwYWNlIGFjY29yZGluZyB0byBNdXN0YWNoZSBzcGVjXG4gIHZhciBySXNXaGl0ZXNwYWNlID0gL1xcUy8sXG4gICAgICByUXVvdCA9IC9cXFwiL2csXG4gICAgICByTmV3bGluZSA9ICAvXFxuL2csXG4gICAgICByQ3IgPSAvXFxyL2csXG4gICAgICByU2xhc2ggPSAvXFxcXC9nLFxuICAgICAgckxpbmVTZXAgPSAvXFx1MjAyOC8sXG4gICAgICByUGFyYWdyYXBoU2VwID0gL1xcdTIwMjkvO1xuXG4gIEhvZ2FuLnRhZ3MgPSB7XG4gICAgJyMnOiAxLCAnXic6IDIsICc8JzogMywgJyQnOiA0LFxuICAgICcvJzogNSwgJyEnOiA2LCAnPic6IDcsICc9JzogOCwgJ192JzogOSxcbiAgICAneyc6IDEwLCAnJic6IDExLCAnX3QnOiAxMlxuICB9O1xuXG4gIEhvZ2FuLnNjYW4gPSBmdW5jdGlvbiBzY2FuKHRleHQsIGRlbGltaXRlcnMpIHtcbiAgICB2YXIgbGVuID0gdGV4dC5sZW5ndGgsXG4gICAgICAgIElOX1RFWFQgPSAwLFxuICAgICAgICBJTl9UQUdfVFlQRSA9IDEsXG4gICAgICAgIElOX1RBRyA9IDIsXG4gICAgICAgIHN0YXRlID0gSU5fVEVYVCxcbiAgICAgICAgdGFnVHlwZSA9IG51bGwsXG4gICAgICAgIHRhZyA9IG51bGwsXG4gICAgICAgIGJ1ZiA9ICcnLFxuICAgICAgICB0b2tlbnMgPSBbXSxcbiAgICAgICAgc2VlblRhZyA9IGZhbHNlLFxuICAgICAgICBpID0gMCxcbiAgICAgICAgbGluZVN0YXJ0ID0gMCxcbiAgICAgICAgb3RhZyA9ICd7eycsXG4gICAgICAgIGN0YWcgPSAnfX0nO1xuXG4gICAgZnVuY3Rpb24gYWRkQnVmKCkge1xuICAgICAgaWYgKGJ1Zi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRva2Vucy5wdXNoKHt0YWc6ICdfdCcsIHRleHQ6IG5ldyBTdHJpbmcoYnVmKX0pO1xuICAgICAgICBidWYgPSAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lSXNXaGl0ZXNwYWNlKCkge1xuICAgICAgdmFyIGlzQWxsV2hpdGVzcGFjZSA9IHRydWU7XG4gICAgICBmb3IgKHZhciBqID0gbGluZVN0YXJ0OyBqIDwgdG9rZW5zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlzQWxsV2hpdGVzcGFjZSA9XG4gICAgICAgICAgKEhvZ2FuLnRhZ3NbdG9rZW5zW2pdLnRhZ10gPCBIb2dhbi50YWdzWydfdiddKSB8fFxuICAgICAgICAgICh0b2tlbnNbal0udGFnID09ICdfdCcgJiYgdG9rZW5zW2pdLnRleHQubWF0Y2gocklzV2hpdGVzcGFjZSkgPT09IG51bGwpO1xuICAgICAgICBpZiAoIWlzQWxsV2hpdGVzcGFjZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXNBbGxXaGl0ZXNwYWNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpbHRlckxpbmUoaGF2ZVNlZW5UYWcsIG5vTmV3TGluZSkge1xuICAgICAgYWRkQnVmKCk7XG5cbiAgICAgIGlmIChoYXZlU2VlblRhZyAmJiBsaW5lSXNXaGl0ZXNwYWNlKCkpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IGxpbmVTdGFydCwgbmV4dDsgaiA8IHRva2Vucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICh0b2tlbnNbal0udGV4dCkge1xuICAgICAgICAgICAgaWYgKChuZXh0ID0gdG9rZW5zW2orMV0pICYmIG5leHQudGFnID09ICc+Jykge1xuICAgICAgICAgICAgICAvLyBzZXQgaW5kZW50IHRvIHRva2VuIHZhbHVlXG4gICAgICAgICAgICAgIG5leHQuaW5kZW50ID0gdG9rZW5zW2pdLnRleHQudG9TdHJpbmcoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9rZW5zLnNwbGljZShqLCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIW5vTmV3TGluZSkge1xuICAgICAgICB0b2tlbnMucHVzaCh7dGFnOidcXG4nfSk7XG4gICAgICB9XG5cbiAgICAgIHNlZW5UYWcgPSBmYWxzZTtcbiAgICAgIGxpbmVTdGFydCA9IHRva2Vucy5sZW5ndGg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hhbmdlRGVsaW1pdGVycyh0ZXh0LCBpbmRleCkge1xuICAgICAgdmFyIGNsb3NlID0gJz0nICsgY3RhZyxcbiAgICAgICAgICBjbG9zZUluZGV4ID0gdGV4dC5pbmRleE9mKGNsb3NlLCBpbmRleCksXG4gICAgICAgICAgZGVsaW1pdGVycyA9IHRyaW0oXG4gICAgICAgICAgICB0ZXh0LnN1YnN0cmluZyh0ZXh0LmluZGV4T2YoJz0nLCBpbmRleCkgKyAxLCBjbG9zZUluZGV4KVxuICAgICAgICAgICkuc3BsaXQoJyAnKTtcblxuICAgICAgb3RhZyA9IGRlbGltaXRlcnNbMF07XG4gICAgICBjdGFnID0gZGVsaW1pdGVyc1tkZWxpbWl0ZXJzLmxlbmd0aCAtIDFdO1xuXG4gICAgICByZXR1cm4gY2xvc2VJbmRleCArIGNsb3NlLmxlbmd0aCAtIDE7XG4gICAgfVxuXG4gICAgaWYgKGRlbGltaXRlcnMpIHtcbiAgICAgIGRlbGltaXRlcnMgPSBkZWxpbWl0ZXJzLnNwbGl0KCcgJyk7XG4gICAgICBvdGFnID0gZGVsaW1pdGVyc1swXTtcbiAgICAgIGN0YWcgPSBkZWxpbWl0ZXJzWzFdO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKHN0YXRlID09IElOX1RFWFQpIHtcbiAgICAgICAgaWYgKHRhZ0NoYW5nZShvdGFnLCB0ZXh0LCBpKSkge1xuICAgICAgICAgIC0taTtcbiAgICAgICAgICBhZGRCdWYoKTtcbiAgICAgICAgICBzdGF0ZSA9IElOX1RBR19UWVBFO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PSAnXFxuJykge1xuICAgICAgICAgICAgZmlsdGVyTGluZShzZWVuVGFnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnVmICs9IHRleHQuY2hhckF0KGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBJTl9UQUdfVFlQRSkge1xuICAgICAgICBpICs9IG90YWcubGVuZ3RoIC0gMTtcbiAgICAgICAgdGFnID0gSG9nYW4udGFnc1t0ZXh0LmNoYXJBdChpICsgMSldO1xuICAgICAgICB0YWdUeXBlID0gdGFnID8gdGV4dC5jaGFyQXQoaSArIDEpIDogJ192JztcbiAgICAgICAgaWYgKHRhZ1R5cGUgPT0gJz0nKSB7XG4gICAgICAgICAgaSA9IGNoYW5nZURlbGltaXRlcnModGV4dCwgaSk7XG4gICAgICAgICAgc3RhdGUgPSBJTl9URVhUO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0YWcpIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdGUgPSBJTl9UQUc7XG4gICAgICAgIH1cbiAgICAgICAgc2VlblRhZyA9IGk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGFnQ2hhbmdlKGN0YWcsIHRleHQsIGkpKSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2goe3RhZzogdGFnVHlwZSwgbjogdHJpbShidWYpLCBvdGFnOiBvdGFnLCBjdGFnOiBjdGFnLFxuICAgICAgICAgICAgICAgICAgICAgICBpOiAodGFnVHlwZSA9PSAnLycpID8gc2VlblRhZyAtIG90YWcubGVuZ3RoIDogaSArIGN0YWcubGVuZ3RofSk7XG4gICAgICAgICAgYnVmID0gJyc7XG4gICAgICAgICAgaSArPSBjdGFnLmxlbmd0aCAtIDE7XG4gICAgICAgICAgc3RhdGUgPSBJTl9URVhUO1xuICAgICAgICAgIGlmICh0YWdUeXBlID09ICd7Jykge1xuICAgICAgICAgICAgaWYgKGN0YWcgPT0gJ319Jykge1xuICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjbGVhblRyaXBsZVN0YWNoZSh0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVmICs9IHRleHQuY2hhckF0KGkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmlsdGVyTGluZShzZWVuVGFnLCB0cnVlKTtcblxuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhblRyaXBsZVN0YWNoZSh0b2tlbikge1xuICAgIGlmICh0b2tlbi5uLnN1YnN0cih0b2tlbi5uLmxlbmd0aCAtIDEpID09PSAnfScpIHtcbiAgICAgIHRva2VuLm4gPSB0b2tlbi5uLnN1YnN0cmluZygwLCB0b2tlbi5uLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRyaW0ocykge1xuICAgIGlmIChzLnRyaW0pIHtcbiAgICAgIHJldHVybiBzLnRyaW0oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcy5yZXBsYWNlKC9eXFxzKnxcXHMqJC9nLCAnJyk7XG4gIH1cblxuICBmdW5jdGlvbiB0YWdDaGFuZ2UodGFnLCB0ZXh0LCBpbmRleCkge1xuICAgIGlmICh0ZXh0LmNoYXJBdChpbmRleCkgIT0gdGFnLmNoYXJBdCgwKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAxLCBsID0gdGFnLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKHRleHQuY2hhckF0KGluZGV4ICsgaSkgIT0gdGFnLmNoYXJBdChpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyB0aGUgdGFncyBhbGxvd2VkIGluc2lkZSBzdXBlciB0ZW1wbGF0ZXNcbiAgdmFyIGFsbG93ZWRJblN1cGVyID0geydfdCc6IHRydWUsICdcXG4nOiB0cnVlLCAnJCc6IHRydWUsICcvJzogdHJ1ZX07XG5cbiAgZnVuY3Rpb24gYnVpbGRUcmVlKHRva2Vucywga2luZCwgc3RhY2ssIGN1c3RvbVRhZ3MpIHtcbiAgICB2YXIgaW5zdHJ1Y3Rpb25zID0gW10sXG4gICAgICAgIG9wZW5lciA9IG51bGwsXG4gICAgICAgIHRhaWwgPSBudWxsLFxuICAgICAgICB0b2tlbiA9IG51bGw7XG5cbiAgICB0YWlsID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG5cbiAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRva2VuID0gdG9rZW5zLnNoaWZ0KCk7XG5cbiAgICAgIGlmICh0YWlsICYmIHRhaWwudGFnID09ICc8JyAmJiAhKHRva2VuLnRhZyBpbiBhbGxvd2VkSW5TdXBlcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGNvbnRlbnQgaW4gPCBzdXBlciB0YWcuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChIb2dhbi50YWdzW3Rva2VuLnRhZ10gPD0gSG9nYW4udGFnc1snJCddIHx8IGlzT3BlbmVyKHRva2VuLCBjdXN0b21UYWdzKSkge1xuICAgICAgICBzdGFjay5wdXNoKHRva2VuKTtcbiAgICAgICAgdG9rZW4ubm9kZXMgPSBidWlsZFRyZWUodG9rZW5zLCB0b2tlbi50YWcsIHN0YWNrLCBjdXN0b21UYWdzKTtcbiAgICAgIH0gZWxzZSBpZiAodG9rZW4udGFnID09ICcvJykge1xuICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDbG9zaW5nIHRhZyB3aXRob3V0IG9wZW5lcjogLycgKyB0b2tlbi5uKTtcbiAgICAgICAgfVxuICAgICAgICBvcGVuZXIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgaWYgKHRva2VuLm4gIT0gb3BlbmVyLm4gJiYgIWlzQ2xvc2VyKHRva2VuLm4sIG9wZW5lci5uLCBjdXN0b21UYWdzKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmVzdGluZyBlcnJvcjogJyArIG9wZW5lci5uICsgJyB2cy4gJyArIHRva2VuLm4pO1xuICAgICAgICB9XG4gICAgICAgIG9wZW5lci5lbmQgPSB0b2tlbi5pO1xuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25zO1xuICAgICAgfSBlbHNlIGlmICh0b2tlbi50YWcgPT0gJ1xcbicpIHtcbiAgICAgICAgdG9rZW4ubGFzdCA9ICh0b2tlbnMubGVuZ3RoID09IDApIHx8ICh0b2tlbnNbMF0udGFnID09ICdcXG4nKTtcbiAgICAgIH1cblxuICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2godG9rZW4pO1xuICAgIH1cblxuICAgIGlmIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2xvc2luZyB0YWc6ICcgKyBzdGFjay5wb3AoKS5uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdHJ1Y3Rpb25zO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNPcGVuZXIodG9rZW4sIHRhZ3MpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRhZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAodGFnc1tpXS5vID09IHRva2VuLm4pIHtcbiAgICAgICAgdG9rZW4udGFnID0gJyMnO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc0Nsb3NlcihjbG9zZSwgb3BlbiwgdGFncykge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGFncy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmICh0YWdzW2ldLmMgPT0gY2xvc2UgJiYgdGFnc1tpXS5vID09IG9wZW4pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RyaW5naWZ5U3Vic3RpdHV0aW9ucyhvYmopIHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpdGVtcy5wdXNoKCdcIicgKyBlc2Moa2V5KSArICdcIjogZnVuY3Rpb24oYyxwLHQsaSkgeycgKyBvYmpba2V5XSArICd9Jyk7XG4gICAgfVxuICAgIHJldHVybiBcInsgXCIgKyBpdGVtcy5qb2luKFwiLFwiKSArIFwiIH1cIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0cmluZ2lmeVBhcnRpYWxzKGNvZGVPYmopIHtcbiAgICB2YXIgcGFydGlhbHMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gY29kZU9iai5wYXJ0aWFscykge1xuICAgICAgcGFydGlhbHMucHVzaCgnXCInICsgZXNjKGtleSkgKyAnXCI6e25hbWU6XCInICsgZXNjKGNvZGVPYmoucGFydGlhbHNba2V5XS5uYW1lKSArICdcIiwgJyArIHN0cmluZ2lmeVBhcnRpYWxzKGNvZGVPYmoucGFydGlhbHNba2V5XSkgKyBcIn1cIik7XG4gICAgfVxuICAgIHJldHVybiBcInBhcnRpYWxzOiB7XCIgKyBwYXJ0aWFscy5qb2luKFwiLFwiKSArIFwifSwgc3ViczogXCIgKyBzdHJpbmdpZnlTdWJzdGl0dXRpb25zKGNvZGVPYmouc3Vicyk7XG4gIH1cblxuICBIb2dhbi5zdHJpbmdpZnkgPSBmdW5jdGlvbihjb2RlT2JqLCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIFwie2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyBcIiArIEhvZ2FuLndyYXBNYWluKGNvZGVPYmouY29kZSkgKyBcIiB9LFwiICsgc3RyaW5naWZ5UGFydGlhbHMoY29kZU9iaikgKyAgXCJ9XCI7XG4gIH1cblxuICB2YXIgc2VyaWFsTm8gPSAwO1xuICBIb2dhbi5nZW5lcmF0ZSA9IGZ1bmN0aW9uKHRyZWUsIHRleHQsIG9wdGlvbnMpIHtcbiAgICBzZXJpYWxObyA9IDA7XG4gICAgdmFyIGNvbnRleHQgPSB7IGNvZGU6ICcnLCBzdWJzOiB7fSwgcGFydGlhbHM6IHt9IH07XG4gICAgSG9nYW4ud2Fsayh0cmVlLCBjb250ZXh0KTtcblxuICAgIGlmIChvcHRpb25zLmFzU3RyaW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJpbmdpZnkoY29udGV4dCwgdGV4dCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubWFrZVRlbXBsYXRlKGNvbnRleHQsIHRleHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgSG9nYW4ud3JhcE1haW4gPSBmdW5jdGlvbihjb2RlKSB7XG4gICAgcmV0dXJuICd2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpOycgKyBjb2RlICsgJ3JldHVybiB0LmZsKCk7JztcbiAgfVxuXG4gIEhvZ2FuLnRlbXBsYXRlID0gSG9nYW4uVGVtcGxhdGU7XG5cbiAgSG9nYW4ubWFrZVRlbXBsYXRlID0gZnVuY3Rpb24oY29kZU9iaiwgdGV4dCwgb3B0aW9ucykge1xuICAgIHZhciB0ZW1wbGF0ZSA9IHRoaXMubWFrZVBhcnRpYWxzKGNvZGVPYmopO1xuICAgIHRlbXBsYXRlLmNvZGUgPSBuZXcgRnVuY3Rpb24oJ2MnLCAncCcsICdpJywgdGhpcy53cmFwTWFpbihjb2RlT2JqLmNvZGUpKTtcbiAgICByZXR1cm4gbmV3IHRoaXMudGVtcGxhdGUodGVtcGxhdGUsIHRleHQsIHRoaXMsIG9wdGlvbnMpO1xuICB9XG5cbiAgSG9nYW4ubWFrZVBhcnRpYWxzID0gZnVuY3Rpb24oY29kZU9iaikge1xuICAgIHZhciBrZXksIHRlbXBsYXRlID0ge3N1YnM6IHt9LCBwYXJ0aWFsczogY29kZU9iai5wYXJ0aWFscywgbmFtZTogY29kZU9iai5uYW1lfTtcbiAgICBmb3IgKGtleSBpbiB0ZW1wbGF0ZS5wYXJ0aWFscykge1xuICAgICAgdGVtcGxhdGUucGFydGlhbHNba2V5XSA9IHRoaXMubWFrZVBhcnRpYWxzKHRlbXBsYXRlLnBhcnRpYWxzW2tleV0pO1xuICAgIH1cbiAgICBmb3IgKGtleSBpbiBjb2RlT2JqLnN1YnMpIHtcbiAgICAgIHRlbXBsYXRlLnN1YnNba2V5XSA9IG5ldyBGdW5jdGlvbignYycsICdwJywgJ3QnLCAnaScsIGNvZGVPYmouc3Vic1trZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9XG5cbiAgZnVuY3Rpb24gZXNjKHMpIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKHJTbGFzaCwgJ1xcXFxcXFxcJylcbiAgICAgICAgICAgIC5yZXBsYWNlKHJRdW90LCAnXFxcXFxcXCInKVxuICAgICAgICAgICAgLnJlcGxhY2Uock5ld2xpbmUsICdcXFxcbicpXG4gICAgICAgICAgICAucmVwbGFjZShyQ3IsICdcXFxccicpXG4gICAgICAgICAgICAucmVwbGFjZShyTGluZVNlcCwgJ1xcXFx1MjAyOCcpXG4gICAgICAgICAgICAucmVwbGFjZShyUGFyYWdyYXBoU2VwLCAnXFxcXHUyMDI5Jyk7XG4gIH1cblxuICBmdW5jdGlvbiBjaG9vc2VNZXRob2Qocykge1xuICAgIHJldHVybiAofnMuaW5kZXhPZignLicpKSA/ICdkJyA6ICdmJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVBhcnRpYWwobm9kZSwgY29udGV4dCkge1xuICAgIHZhciBwcmVmaXggPSBcIjxcIiArIChjb250ZXh0LnByZWZpeCB8fCBcIlwiKTtcbiAgICB2YXIgc3ltID0gcHJlZml4ICsgbm9kZS5uICsgc2VyaWFsTm8rKztcbiAgICBjb250ZXh0LnBhcnRpYWxzW3N5bV0gPSB7bmFtZTogbm9kZS5uLCBwYXJ0aWFsczoge319O1xuICAgIGNvbnRleHQuY29kZSArPSAndC5iKHQucnAoXCInICsgIGVzYyhzeW0pICsgJ1wiLGMscCxcIicgKyAobm9kZS5pbmRlbnQgfHwgJycpICsgJ1wiKSk7JztcbiAgICByZXR1cm4gc3ltO1xuICB9XG5cbiAgSG9nYW4uY29kZWdlbiA9IHtcbiAgICAnIyc6IGZ1bmN0aW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgICAgIGNvbnRleHQuY29kZSArPSAnaWYodC5zKHQuJyArIGNob29zZU1ldGhvZChub2RlLm4pICsgJyhcIicgKyBlc2Mobm9kZS5uKSArICdcIixjLHAsMSksJyArXG4gICAgICAgICAgICAgICAgICAgICAgJ2MscCwwLCcgKyBub2RlLmkgKyAnLCcgKyBub2RlLmVuZCArICcsXCInICsgbm9kZS5vdGFnICsgXCIgXCIgKyBub2RlLmN0YWcgKyAnXCIpKXsnICtcbiAgICAgICAgICAgICAgICAgICAgICAndC5ycyhjLHAsJyArICdmdW5jdGlvbihjLHAsdCl7JztcbiAgICAgIEhvZ2FuLndhbGsobm9kZS5ub2RlcywgY29udGV4dCk7XG4gICAgICBjb250ZXh0LmNvZGUgKz0gJ30pO2MucG9wKCk7fSc7XG4gICAgfSxcblxuICAgICdeJzogZnVuY3Rpb24obm9kZSwgY29udGV4dCkge1xuICAgICAgY29udGV4dC5jb2RlICs9ICdpZighdC5zKHQuJyArIGNob29zZU1ldGhvZChub2RlLm4pICsgJyhcIicgKyBlc2Mobm9kZS5uKSArICdcIixjLHAsMSksYyxwLDEsMCwwLFwiXCIpKXsnO1xuICAgICAgSG9nYW4ud2Fsayhub2RlLm5vZGVzLCBjb250ZXh0KTtcbiAgICAgIGNvbnRleHQuY29kZSArPSAnfTsnO1xuICAgIH0sXG5cbiAgICAnPic6IGNyZWF0ZVBhcnRpYWwsXG4gICAgJzwnOiBmdW5jdGlvbihub2RlLCBjb250ZXh0KSB7XG4gICAgICB2YXIgY3R4ID0ge3BhcnRpYWxzOiB7fSwgY29kZTogJycsIHN1YnM6IHt9LCBpblBhcnRpYWw6IHRydWV9O1xuICAgICAgSG9nYW4ud2Fsayhub2RlLm5vZGVzLCBjdHgpO1xuICAgICAgdmFyIHRlbXBsYXRlID0gY29udGV4dC5wYXJ0aWFsc1tjcmVhdGVQYXJ0aWFsKG5vZGUsIGNvbnRleHQpXTtcbiAgICAgIHRlbXBsYXRlLnN1YnMgPSBjdHguc3VicztcbiAgICAgIHRlbXBsYXRlLnBhcnRpYWxzID0gY3R4LnBhcnRpYWxzO1xuICAgIH0sXG5cbiAgICAnJCc6IGZ1bmN0aW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgICAgIHZhciBjdHggPSB7c3Viczoge30sIGNvZGU6ICcnLCBwYXJ0aWFsczogY29udGV4dC5wYXJ0aWFscywgcHJlZml4OiBub2RlLm59O1xuICAgICAgSG9nYW4ud2Fsayhub2RlLm5vZGVzLCBjdHgpO1xuICAgICAgY29udGV4dC5zdWJzW25vZGUubl0gPSBjdHguY29kZTtcbiAgICAgIGlmICghY29udGV4dC5pblBhcnRpYWwpIHtcbiAgICAgICAgY29udGV4dC5jb2RlICs9ICd0LnN1YihcIicgKyBlc2Mobm9kZS5uKSArICdcIixjLHAsaSk7JztcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ1xcbic6IGZ1bmN0aW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgICAgIGNvbnRleHQuY29kZSArPSB3cml0ZSgnXCJcXFxcblwiJyArIChub2RlLmxhc3QgPyAnJyA6ICcgKyBpJykpO1xuICAgIH0sXG5cbiAgICAnX3YnOiBmdW5jdGlvbihub2RlLCBjb250ZXh0KSB7XG4gICAgICBjb250ZXh0LmNvZGUgKz0gJ3QuYih0LnYodC4nICsgY2hvb3NlTWV0aG9kKG5vZGUubikgKyAnKFwiJyArIGVzYyhub2RlLm4pICsgJ1wiLGMscCwwKSkpOyc7XG4gICAgfSxcblxuICAgICdfdCc6IGZ1bmN0aW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgICAgIGNvbnRleHQuY29kZSArPSB3cml0ZSgnXCInICsgZXNjKG5vZGUudGV4dCkgKyAnXCInKTtcbiAgICB9LFxuXG4gICAgJ3snOiB0cmlwbGVTdGFjaGUsXG5cbiAgICAnJic6IHRyaXBsZVN0YWNoZVxuICB9XG5cbiAgZnVuY3Rpb24gdHJpcGxlU3RhY2hlKG5vZGUsIGNvbnRleHQpIHtcbiAgICBjb250ZXh0LmNvZGUgKz0gJ3QuYih0LnQodC4nICsgY2hvb3NlTWV0aG9kKG5vZGUubikgKyAnKFwiJyArIGVzYyhub2RlLm4pICsgJ1wiLGMscCwwKSkpOyc7XG4gIH1cblxuICBmdW5jdGlvbiB3cml0ZShzKSB7XG4gICAgcmV0dXJuICd0LmIoJyArIHMgKyAnKTsnO1xuICB9XG5cbiAgSG9nYW4ud2FsayA9IGZ1bmN0aW9uKG5vZGVsaXN0LCBjb250ZXh0KSB7XG4gICAgdmFyIGZ1bmM7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2RlbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGZ1bmMgPSBIb2dhbi5jb2RlZ2VuW25vZGVsaXN0W2ldLnRhZ107XG4gICAgICBmdW5jICYmIGZ1bmMobm9kZWxpc3RbaV0sIGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuXG4gIEhvZ2FuLnBhcnNlID0gZnVuY3Rpb24odG9rZW5zLCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIGJ1aWxkVHJlZSh0b2tlbnMsICcnLCBbXSwgb3B0aW9ucy5zZWN0aW9uVGFncyB8fCBbXSk7XG4gIH1cblxuICBIb2dhbi5jYWNoZSA9IHt9O1xuXG4gIEhvZ2FuLmNhY2hlS2V5ID0gZnVuY3Rpb24odGV4dCwgb3B0aW9ucykge1xuICAgIHJldHVybiBbdGV4dCwgISFvcHRpb25zLmFzU3RyaW5nLCAhIW9wdGlvbnMuZGlzYWJsZUxhbWJkYSwgb3B0aW9ucy5kZWxpbWl0ZXJzLCAhIW9wdGlvbnMubW9kZWxHZXRdLmpvaW4oJ3x8Jyk7XG4gIH1cblxuICBIb2dhbi5jb21waWxlID0gZnVuY3Rpb24odGV4dCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHZhciBrZXkgPSBIb2dhbi5jYWNoZUtleSh0ZXh0LCBvcHRpb25zKTtcbiAgICB2YXIgdGVtcGxhdGUgPSB0aGlzLmNhY2hlW2tleV07XG5cbiAgICBpZiAodGVtcGxhdGUpIHtcbiAgICAgIHZhciBwYXJ0aWFscyA9IHRlbXBsYXRlLnBhcnRpYWxzO1xuICAgICAgZm9yICh2YXIgbmFtZSBpbiBwYXJ0aWFscykge1xuICAgICAgICBkZWxldGUgcGFydGlhbHNbbmFtZV0uaW5zdGFuY2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgdGVtcGxhdGUgPSB0aGlzLmdlbmVyYXRlKHRoaXMucGFyc2UodGhpcy5zY2FuKHRleHQsIG9wdGlvbnMuZGVsaW1pdGVycyksIHRleHQsIG9wdGlvbnMpLCB0ZXh0LCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZVtrZXldID0gdGVtcGxhdGU7XG4gIH1cbn0pKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJyA/IGV4cG9ydHMgOiBIb2dhbik7XG4iLCIvKlxuICogIENvcHlyaWdodCAyMDExIFR3aXR0ZXIsIEluYy5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8vIFRoaXMgZmlsZSBpcyBmb3IgdXNlIHdpdGggTm9kZS5qcy4gU2VlIGRpc3QvIGZvciBicm93c2VyIGZpbGVzLlxuXG52YXIgSG9nYW4gPSByZXF1aXJlKCcuL2NvbXBpbGVyJyk7XG5Ib2dhbi5UZW1wbGF0ZSA9IHJlcXVpcmUoJy4vdGVtcGxhdGUnKS5UZW1wbGF0ZTtcbkhvZ2FuLnRlbXBsYXRlID0gSG9nYW4uVGVtcGxhdGU7XG5tb2R1bGUuZXhwb3J0cyA9IEhvZ2FuO1xuIiwiLypcbiAqICBDb3B5cmlnaHQgMjAxMSBUd2l0dGVyLCBJbmMuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG52YXIgSG9nYW4gPSB7fTtcblxuKGZ1bmN0aW9uIChIb2dhbikge1xuICBIb2dhbi5UZW1wbGF0ZSA9IGZ1bmN0aW9uIChjb2RlT2JqLCB0ZXh0LCBjb21waWxlciwgb3B0aW9ucykge1xuICAgIGNvZGVPYmogPSBjb2RlT2JqIHx8IHt9O1xuICAgIHRoaXMuciA9IGNvZGVPYmouY29kZSB8fCB0aGlzLnI7XG4gICAgdGhpcy5jID0gY29tcGlsZXI7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLnRleHQgPSB0ZXh0IHx8ICcnO1xuICAgIHRoaXMucGFydGlhbHMgPSBjb2RlT2JqLnBhcnRpYWxzIHx8IHt9O1xuICAgIHRoaXMuc3VicyA9IGNvZGVPYmouc3VicyB8fCB7fTtcbiAgICB0aGlzLmJ1ZiA9ICcnO1xuICB9XG5cbiAgSG9nYW4uVGVtcGxhdGUucHJvdG90eXBlID0ge1xuICAgIC8vIHJlbmRlcjogcmVwbGFjZWQgYnkgZ2VuZXJhdGVkIGNvZGUuXG4gICAgcjogZnVuY3Rpb24gKGNvbnRleHQsIHBhcnRpYWxzLCBpbmRlbnQpIHsgcmV0dXJuICcnOyB9LFxuXG4gICAgLy8gdmFyaWFibGUgZXNjYXBpbmdcbiAgICB2OiBob2dhbkVzY2FwZSxcblxuICAgIC8vIHRyaXBsZSBzdGFjaGVcbiAgICB0OiBjb2VyY2VUb1N0cmluZyxcblxuICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGNvbnRleHQsIHBhcnRpYWxzLCBpbmRlbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJpKFtjb250ZXh0XSwgcGFydGlhbHMgfHwge30sIGluZGVudCk7XG4gICAgfSxcblxuICAgIC8vIHJlbmRlciBpbnRlcm5hbCAtLSBhIGhvb2sgZm9yIG92ZXJyaWRlcyB0aGF0IGNhdGNoZXMgcGFydGlhbHMgdG9vXG4gICAgcmk6IGZ1bmN0aW9uIChjb250ZXh0LCBwYXJ0aWFscywgaW5kZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5yKGNvbnRleHQsIHBhcnRpYWxzLCBpbmRlbnQpO1xuICAgIH0sXG5cbiAgICAvLyBlbnN1cmVQYXJ0aWFsXG4gICAgZXA6IGZ1bmN0aW9uKHN5bWJvbCwgcGFydGlhbHMpIHtcbiAgICAgIHZhciBwYXJ0aWFsID0gdGhpcy5wYXJ0aWFsc1tzeW1ib2xdO1xuXG4gICAgICAvLyBjaGVjayB0byBzZWUgdGhhdCBpZiB3ZSd2ZSBpbnN0YW50aWF0ZWQgdGhpcyBwYXJ0aWFsIGJlZm9yZVxuICAgICAgdmFyIHRlbXBsYXRlID0gcGFydGlhbHNbcGFydGlhbC5uYW1lXTtcbiAgICAgIGlmIChwYXJ0aWFsLmluc3RhbmNlICYmIHBhcnRpYWwuYmFzZSA9PSB0ZW1wbGF0ZSkge1xuICAgICAgICByZXR1cm4gcGFydGlhbC5pbnN0YW5jZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZSA9PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoIXRoaXMuYykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbXBpbGVyIGF2YWlsYWJsZS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgdGVtcGxhdGUgPSB0aGlzLmMuY29tcGlsZSh0ZW1wbGF0ZSwgdGhpcy5vcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0ZW1wbGF0ZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gV2UgdXNlIHRoaXMgdG8gY2hlY2sgd2hldGhlciB0aGUgcGFydGlhbHMgZGljdGlvbmFyeSBoYXMgY2hhbmdlZFxuICAgICAgdGhpcy5wYXJ0aWFsc1tzeW1ib2xdLmJhc2UgPSB0ZW1wbGF0ZTtcblxuICAgICAgaWYgKHBhcnRpYWwuc3Vicykge1xuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY29uc2lkZXIgcGFyZW50IHRlbXBsYXRlIG5vd1xuICAgICAgICBpZiAoIXBhcnRpYWxzLnN0YWNrVGV4dCkgcGFydGlhbHMuc3RhY2tUZXh0ID0ge307XG4gICAgICAgIGZvciAoa2V5IGluIHBhcnRpYWwuc3Vicykge1xuICAgICAgICAgIGlmICghcGFydGlhbHMuc3RhY2tUZXh0W2tleV0pIHtcbiAgICAgICAgICAgIHBhcnRpYWxzLnN0YWNrVGV4dFtrZXldID0gKHRoaXMuYWN0aXZlU3ViICE9PSB1bmRlZmluZWQgJiYgcGFydGlhbHMuc3RhY2tUZXh0W3RoaXMuYWN0aXZlU3ViXSkgPyBwYXJ0aWFscy5zdGFja1RleHRbdGhpcy5hY3RpdmVTdWJdIDogdGhpcy50ZXh0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0ZW1wbGF0ZSA9IGNyZWF0ZVNwZWNpYWxpemVkUGFydGlhbCh0ZW1wbGF0ZSwgcGFydGlhbC5zdWJzLCBwYXJ0aWFsLnBhcnRpYWxzLFxuICAgICAgICAgIHRoaXMuc3RhY2tTdWJzLCB0aGlzLnN0YWNrUGFydGlhbHMsIHBhcnRpYWxzLnN0YWNrVGV4dCk7XG4gICAgICB9XG4gICAgICB0aGlzLnBhcnRpYWxzW3N5bWJvbF0uaW5zdGFuY2UgPSB0ZW1wbGF0ZTtcblxuICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgIH0sXG5cbiAgICAvLyB0cmllcyB0byBmaW5kIGEgcGFydGlhbCBpbiB0aGUgY3VycmVudCBzY29wZSBhbmQgcmVuZGVyIGl0XG4gICAgcnA6IGZ1bmN0aW9uKHN5bWJvbCwgY29udGV4dCwgcGFydGlhbHMsIGluZGVudCkge1xuICAgICAgdmFyIHBhcnRpYWwgPSB0aGlzLmVwKHN5bWJvbCwgcGFydGlhbHMpO1xuICAgICAgaWYgKCFwYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnRpYWwucmkoY29udGV4dCwgcGFydGlhbHMsIGluZGVudCk7XG4gICAgfSxcblxuICAgIC8vIHJlbmRlciBhIHNlY3Rpb25cbiAgICByczogZnVuY3Rpb24oY29udGV4dCwgcGFydGlhbHMsIHNlY3Rpb24pIHtcbiAgICAgIHZhciB0YWlsID0gY29udGV4dFtjb250ZXh0Lmxlbmd0aCAtIDFdO1xuXG4gICAgICBpZiAoIWlzQXJyYXkodGFpbCkpIHtcbiAgICAgICAgc2VjdGlvbihjb250ZXh0LCBwYXJ0aWFscywgdGhpcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWlsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnRleHQucHVzaCh0YWlsW2ldKTtcbiAgICAgICAgc2VjdGlvbihjb250ZXh0LCBwYXJ0aWFscywgdGhpcyk7XG4gICAgICAgIGNvbnRleHQucG9wKCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIG1heWJlIHN0YXJ0IGEgc2VjdGlvblxuICAgIHM6IGZ1bmN0aW9uKHZhbCwgY3R4LCBwYXJ0aWFscywgaW52ZXJ0ZWQsIHN0YXJ0LCBlbmQsIHRhZ3MpIHtcbiAgICAgIHZhciBwYXNzO1xuXG4gICAgICBpZiAoaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbCA9IHRoaXMubXModmFsLCBjdHgsIHBhcnRpYWxzLCBpbnZlcnRlZCwgc3RhcnQsIGVuZCwgdGFncyk7XG4gICAgICB9XG5cbiAgICAgIHBhc3MgPSAhIXZhbDtcblxuICAgICAgaWYgKCFpbnZlcnRlZCAmJiBwYXNzICYmIGN0eCkge1xuICAgICAgICBjdHgucHVzaCgodHlwZW9mIHZhbCA9PSAnb2JqZWN0JykgPyB2YWwgOiBjdHhbY3R4Lmxlbmd0aCAtIDFdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhc3M7XG4gICAgfSxcblxuICAgIC8vIGZpbmQgdmFsdWVzIHdpdGggZG90dGVkIG5hbWVzXG4gICAgZDogZnVuY3Rpb24oa2V5LCBjdHgsIHBhcnRpYWxzLCByZXR1cm5Gb3VuZCkge1xuICAgICAgdmFyIGZvdW5kLFxuICAgICAgICAgIG5hbWVzID0ga2V5LnNwbGl0KCcuJyksXG4gICAgICAgICAgdmFsID0gdGhpcy5mKG5hbWVzWzBdLCBjdHgsIHBhcnRpYWxzLCByZXR1cm5Gb3VuZCksXG4gICAgICAgICAgZG9Nb2RlbEdldCA9IHRoaXMub3B0aW9ucy5tb2RlbEdldCxcbiAgICAgICAgICBjeCA9IG51bGw7XG5cbiAgICAgIGlmIChrZXkgPT09ICcuJyAmJiBpc0FycmF5KGN0eFtjdHgubGVuZ3RoIC0gMl0pKSB7XG4gICAgICAgIHZhbCA9IGN0eFtjdHgubGVuZ3RoIC0gMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgZm91bmQgPSBmaW5kSW5TY29wZShuYW1lc1tpXSwgdmFsLCBkb01vZGVsR2V0KTtcbiAgICAgICAgICBpZiAoZm91bmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY3ggPSB2YWw7XG4gICAgICAgICAgICB2YWwgPSBmb3VuZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXR1cm5Gb3VuZCAmJiAhdmFsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXR1cm5Gb3VuZCAmJiB0eXBlb2YgdmFsID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY3R4LnB1c2goY3gpO1xuICAgICAgICB2YWwgPSB0aGlzLm12KHZhbCwgY3R4LCBwYXJ0aWFscyk7XG4gICAgICAgIGN0eC5wb3AoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgLy8gZmluZCB2YWx1ZXMgd2l0aCBub3JtYWwgbmFtZXNcbiAgICBmOiBmdW5jdGlvbihrZXksIGN0eCwgcGFydGlhbHMsIHJldHVybkZvdW5kKSB7XG4gICAgICB2YXIgdmFsID0gZmFsc2UsXG4gICAgICAgICAgdiA9IG51bGwsXG4gICAgICAgICAgZm91bmQgPSBmYWxzZSxcbiAgICAgICAgICBkb01vZGVsR2V0ID0gdGhpcy5vcHRpb25zLm1vZGVsR2V0O1xuXG4gICAgICBmb3IgKHZhciBpID0gY3R4Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHYgPSBjdHhbaV07XG4gICAgICAgIHZhbCA9IGZpbmRJblNjb3BlKGtleSwgdiwgZG9Nb2RlbEdldCk7XG4gICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgIHJldHVybiAocmV0dXJuRm91bmQpID8gZmFsc2UgOiBcIlwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJldHVybkZvdW5kICYmIHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWwgPSB0aGlzLm12KHZhbCwgY3R4LCBwYXJ0aWFscyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIC8vIGhpZ2hlciBvcmRlciB0ZW1wbGF0ZXNcbiAgICBsczogZnVuY3Rpb24oZnVuYywgY3gsIHBhcnRpYWxzLCB0ZXh0LCB0YWdzKSB7XG4gICAgICB2YXIgb2xkVGFncyA9IHRoaXMub3B0aW9ucy5kZWxpbWl0ZXJzO1xuXG4gICAgICB0aGlzLm9wdGlvbnMuZGVsaW1pdGVycyA9IHRhZ3M7XG4gICAgICB0aGlzLmIodGhpcy5jdChjb2VyY2VUb1N0cmluZyhmdW5jLmNhbGwoY3gsIHRleHQpKSwgY3gsIHBhcnRpYWxzKSk7XG4gICAgICB0aGlzLm9wdGlvbnMuZGVsaW1pdGVycyA9IG9sZFRhZ3M7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLy8gY29tcGlsZSB0ZXh0XG4gICAgY3Q6IGZ1bmN0aW9uKHRleHQsIGN4LCBwYXJ0aWFscykge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlTGFtYmRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTGFtYmRhIGZlYXR1cmVzIGRpc2FibGVkLicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYy5jb21waWxlKHRleHQsIHRoaXMub3B0aW9ucykucmVuZGVyKGN4LCBwYXJ0aWFscyk7XG4gICAgfSxcblxuICAgIC8vIHRlbXBsYXRlIHJlc3VsdCBidWZmZXJpbmdcbiAgICBiOiBmdW5jdGlvbihzKSB7IHRoaXMuYnVmICs9IHM7IH0sXG5cbiAgICBmbDogZnVuY3Rpb24oKSB7IHZhciByID0gdGhpcy5idWY7IHRoaXMuYnVmID0gJyc7IHJldHVybiByOyB9LFxuXG4gICAgLy8gbWV0aG9kIHJlcGxhY2Ugc2VjdGlvblxuICAgIG1zOiBmdW5jdGlvbihmdW5jLCBjdHgsIHBhcnRpYWxzLCBpbnZlcnRlZCwgc3RhcnQsIGVuZCwgdGFncykge1xuICAgICAgdmFyIHRleHRTb3VyY2UsXG4gICAgICAgICAgY3ggPSBjdHhbY3R4Lmxlbmd0aCAtIDFdLFxuICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuY2FsbChjeCk7XG5cbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKGludmVydGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGV4dFNvdXJjZSA9ICh0aGlzLmFjdGl2ZVN1YiAmJiB0aGlzLnN1YnNUZXh0ICYmIHRoaXMuc3Vic1RleHRbdGhpcy5hY3RpdmVTdWJdKSA/IHRoaXMuc3Vic1RleHRbdGhpcy5hY3RpdmVTdWJdIDogdGhpcy50ZXh0O1xuICAgICAgICAgIHJldHVybiB0aGlzLmxzKHJlc3VsdCwgY3gsIHBhcnRpYWxzLCB0ZXh0U291cmNlLnN1YnN0cmluZyhzdGFydCwgZW5kKSwgdGFncyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgLy8gbWV0aG9kIHJlcGxhY2UgdmFyaWFibGVcbiAgICBtdjogZnVuY3Rpb24oZnVuYywgY3R4LCBwYXJ0aWFscykge1xuICAgICAgdmFyIGN4ID0gY3R4W2N0eC5sZW5ndGggLSAxXTtcbiAgICAgIHZhciByZXN1bHQgPSBmdW5jLmNhbGwoY3gpO1xuXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0KGNvZXJjZVRvU3RyaW5nKHJlc3VsdC5jYWxsKGN4KSksIGN4LCBwYXJ0aWFscyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIHN1YjogZnVuY3Rpb24obmFtZSwgY29udGV4dCwgcGFydGlhbHMsIGluZGVudCkge1xuICAgICAgdmFyIGYgPSB0aGlzLnN1YnNbbmFtZV07XG4gICAgICBpZiAoZikge1xuICAgICAgICB0aGlzLmFjdGl2ZVN1YiA9IG5hbWU7XG4gICAgICAgIGYoY29udGV4dCwgcGFydGlhbHMsIHRoaXMsIGluZGVudCk7XG4gICAgICAgIHRoaXMuYWN0aXZlU3ViID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gIH07XG5cbiAgLy9GaW5kIGEga2V5IGluIGFuIG9iamVjdFxuICBmdW5jdGlvbiBmaW5kSW5TY29wZShrZXksIHNjb3BlLCBkb01vZGVsR2V0KSB7XG4gICAgdmFyIHZhbDtcblxuICAgIGlmIChzY29wZSAmJiB0eXBlb2Ygc2NvcGUgPT0gJ29iamVjdCcpIHtcblxuICAgICAgaWYgKHNjb3BlW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWwgPSBzY29wZVtrZXldO1xuXG4gICAgICAvLyB0cnkgbG9va3VwIHdpdGggZ2V0IGZvciBiYWNrYm9uZSBvciBzaW1pbGFyIG1vZGVsIGRhdGFcbiAgICAgIH0gZWxzZSBpZiAoZG9Nb2RlbEdldCAmJiBzY29wZS5nZXQgJiYgdHlwZW9mIHNjb3BlLmdldCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbCA9IHNjb3BlLmdldChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTcGVjaWFsaXplZFBhcnRpYWwoaW5zdGFuY2UsIHN1YnMsIHBhcnRpYWxzLCBzdGFja1N1YnMsIHN0YWNrUGFydGlhbHMsIHN0YWNrVGV4dCkge1xuICAgIGZ1bmN0aW9uIFBhcnRpYWxUZW1wbGF0ZSgpIHt9O1xuICAgIFBhcnRpYWxUZW1wbGF0ZS5wcm90b3R5cGUgPSBpbnN0YW5jZTtcbiAgICBmdW5jdGlvbiBTdWJzdGl0dXRpb25zKCkge307XG4gICAgU3Vic3RpdHV0aW9ucy5wcm90b3R5cGUgPSBpbnN0YW5jZS5zdWJzO1xuICAgIHZhciBrZXk7XG4gICAgdmFyIHBhcnRpYWwgPSBuZXcgUGFydGlhbFRlbXBsYXRlKCk7XG4gICAgcGFydGlhbC5zdWJzID0gbmV3IFN1YnN0aXR1dGlvbnMoKTtcbiAgICBwYXJ0aWFsLnN1YnNUZXh0ID0ge307ICAvL2hlaGUuIHN1YnN0ZXh0LlxuICAgIHBhcnRpYWwuYnVmID0gJyc7XG5cbiAgICBzdGFja1N1YnMgPSBzdGFja1N1YnMgfHwge307XG4gICAgcGFydGlhbC5zdGFja1N1YnMgPSBzdGFja1N1YnM7XG4gICAgcGFydGlhbC5zdWJzVGV4dCA9IHN0YWNrVGV4dDtcbiAgICBmb3IgKGtleSBpbiBzdWJzKSB7XG4gICAgICBpZiAoIXN0YWNrU3Vic1trZXldKSBzdGFja1N1YnNba2V5XSA9IHN1YnNba2V5XTtcbiAgICB9XG4gICAgZm9yIChrZXkgaW4gc3RhY2tTdWJzKSB7XG4gICAgICBwYXJ0aWFsLnN1YnNba2V5XSA9IHN0YWNrU3Vic1trZXldO1xuICAgIH1cblxuICAgIHN0YWNrUGFydGlhbHMgPSBzdGFja1BhcnRpYWxzIHx8IHt9O1xuICAgIHBhcnRpYWwuc3RhY2tQYXJ0aWFscyA9IHN0YWNrUGFydGlhbHM7XG4gICAgZm9yIChrZXkgaW4gcGFydGlhbHMpIHtcbiAgICAgIGlmICghc3RhY2tQYXJ0aWFsc1trZXldKSBzdGFja1BhcnRpYWxzW2tleV0gPSBwYXJ0aWFsc1trZXldO1xuICAgIH1cbiAgICBmb3IgKGtleSBpbiBzdGFja1BhcnRpYWxzKSB7XG4gICAgICBwYXJ0aWFsLnBhcnRpYWxzW2tleV0gPSBzdGFja1BhcnRpYWxzW2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRpYWw7XG4gIH1cblxuICB2YXIgckFtcCA9IC8mL2csXG4gICAgICByTHQgPSAvPC9nLFxuICAgICAgckd0ID0gLz4vZyxcbiAgICAgIHJBcG9zID0gL1xcJy9nLFxuICAgICAgclF1b3QgPSAvXFxcIi9nLFxuICAgICAgaENoYXJzID0gL1smPD5cXFwiXFwnXS87XG5cbiAgZnVuY3Rpb24gY29lcmNlVG9TdHJpbmcodmFsKSB7XG4gICAgcmV0dXJuIFN0cmluZygodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSA/ICcnIDogdmFsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhvZ2FuRXNjYXBlKHN0cikge1xuICAgIHN0ciA9IGNvZXJjZVRvU3RyaW5nKHN0cik7XG4gICAgcmV0dXJuIGhDaGFycy50ZXN0KHN0cikgP1xuICAgICAgc3RyXG4gICAgICAgIC5yZXBsYWNlKHJBbXAsICcmYW1wOycpXG4gICAgICAgIC5yZXBsYWNlKHJMdCwgJyZsdDsnKVxuICAgICAgICAucmVwbGFjZShyR3QsICcmZ3Q7JylcbiAgICAgICAgLnJlcGxhY2UockFwb3MsICcmIzM5OycpXG4gICAgICAgIC5yZXBsYWNlKHJRdW90LCAnJnF1b3Q7JykgOlxuICAgICAgc3RyO1xuICB9XG5cbiAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKGEpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpID09PSAnW29iamVjdCBBcnJheV0nO1xuICB9O1xuXG59KSh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcgPyBleHBvcnRzIDogSG9nYW4pO1xuIiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8bGlcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGlkPVxcXCJhcHBlYXJhbmNlLWl0ZW0tXCIpO3QuYih0LnYodC5mKFwiaXRlbWlkXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbSBncm91cC1cIik7dC5iKHQudih0LmYoXCJncm91cFwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGRhdGEtaXRlbWlkPVxcXCJcIik7dC5iKHQudih0LmYoXCJpdGVtaWRcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBkYXRhLW5hbWU9XFxcIlwiKTt0LmIodC52KHQuZihcIm5hbWVcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBkYXRhLXJhcml0eT1cXFwiXCIpO3QuYih0LnYodC5mKFwicmFyaXR5XCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgZGF0YS1yYXJpdHluYW1lPVxcXCJcIik7dC5iKHQudih0LmYoXCJyYXJpdHluYW1lXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDxkaXYgY2xhc3M9XFxcInJhcml0eS1tYXJrZXItXCIpO3QuYih0LnYodC5mKFwicmFyaXR5XCIsYyxwLDApKSk7dC5iKFwiXFxcIj48L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDxpbWcgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbS1pY29uXFxcIiBzcmM9XFxcIlwiKTt0LmIodC52KHQuZihcImljb25cIixjLHAsMCkpKTt0LmIoXCJcXFwiIC8+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPC9saT5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8bGlcXG4gIGlkPVxcXCJhcHBlYXJhbmNlLWl0ZW0te3tpdGVtaWR9fVxcXCJcXG4gIGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW0gZ3JvdXAte3tncm91cH19XFxcIlxcbiAgZGF0YS1pdGVtaWQ9XFxcInt7aXRlbWlkfX1cXFwiXFxuICBkYXRhLW5hbWU9XFxcInt7bmFtZX19XFxcIlxcbiAgZGF0YS1yYXJpdHk9XFxcInt7cmFyaXR5fX1cXFwiXFxuICBkYXRhLXJhcml0eW5hbWU9XFxcInt7cmFyaXR5bmFtZX19XFxcIlxcbj5cXG4gIDxkaXYgY2xhc3M9XFxcInJhcml0eS1tYXJrZXIte3tyYXJpdHl9fVxcXCI+PC9kaXY+XFxuICA8aW1nIGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW0taWNvblxcXCIgc3JjPVxcXCJ7e2ljb259fVxcXCIgLz5cXG48L2xpPlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGRpdlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgaWQ9XFxcImVlLWNhdGVnb3J5XFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcnkgYWN0aXZlXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgZGF0YS1jYXRlZ29yeT1cXFwiXCIpO3QuYih0LnYodC5mKFwiY2F0ZWdvcnlcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBkYXRhLWNhdGVnb3J5aWQ9XFxcIlwiKTt0LmIodC52KHQuZihcImNhdGVnb3J5aWRcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPHN0eWxlPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAjZWUtaXRlbXMge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHNjcm9sbGJhci1jb2xvcjogZGFyaztcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvc3R5bGU+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8dWxcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbXMtbGlzdFxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgaWQ9XFxcImVlLWl0ZW1zXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBzdHlsZT1cXFwibWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDU2NXB4KVxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgID5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgXCIpO3QuYih0LnQodC5mKFwiaXRlbXNcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPC91bD5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8IS0tIEluZm8gLS0+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8ZGl2IGlkPVxcXCJlZS1pbmZvXFxcIiBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtcy1pbmZvXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGRpdiBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pbmZvLXRpcHNcXFwiPjwvZGl2PlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGgzIGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW0taW5mby1uYW1lXFxcIj48L2gzPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGRpdiBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtLWluZm8tZ3VhcmRcXFwiPjwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8ZGl2IGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW0taW5mby1yYXJpdHlcXFwiPjwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8ZGl2IGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW0taW5mby1idXR0b25zXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8ZGl2IGNsYXNzPVxcXCJhcHBlYXJhbmNlLWZvcndhcmQgbmwtYnV0dG9uXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5hcHBlYXJhbmNlLmJ1dHRvbnMuZm9yd2FyZFwiLGMscCwwKSkpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPGRpdiBjbGFzcz1cXFwiYXBwZWFyYW5jZS1iYWNrd2FyZCBubC1idXR0b25cXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLmFwcGVhcmFuY2UuYnV0dG9ucy5iYWNrd2FyZFwiLGMscCwwKSkpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPC9kaXY+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGRpdlxcbiAgaWQ9XFxcImVlLWNhdGVnb3J5XFxcIlxcbiAgY2xhc3M9XFxcImFwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcnkgYWN0aXZlXFxcIlxcbiAgZGF0YS1jYXRlZ29yeT1cXFwie3tjYXRlZ29yeX19XFxcIlxcbiAgZGF0YS1jYXRlZ29yeWlkPVxcXCJ7e2NhdGVnb3J5aWR9fVxcXCJcXG4+XFxuICA8c3R5bGU+XFxuICAgICNlZS1pdGVtcyB7XFxuICAgICAgc2Nyb2xsYmFyLWNvbG9yOiBkYXJrO1xcbiAgICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjtcXG4gICAgfVxcbiAgPC9zdHlsZT5cXG4gIDx1bFxcbiAgICBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtcy1saXN0XFxcIlxcbiAgICBpZD1cXFwiZWUtaXRlbXNcXFwiXFxuICAgIHN0eWxlPVxcXCJtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNTY1cHgpXFxcIlxcbiAgPlxcbiAgICB7e3tpdGVtc319fVxcbiAgPC91bD5cXG5cXG4gIDwhLS0gSW5mbyAtLT5cXG4gIDxkaXYgaWQ9XFxcImVlLWluZm9cXFwiIGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW1zLWluZm9cXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJhcHBlYXJhbmNlLWluZm8tdGlwc1xcXCI+PC9kaXY+XFxuXFxuICAgIDxoMyBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtLWluZm8tbmFtZVxcXCI+PC9oMz5cXG5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtLWluZm8tZ3VhcmRcXFwiPjwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW0taW5mby1yYXJpdHlcXFwiPjwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW0taW5mby1idXR0b25zXFxcIj5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJhcHBlYXJhbmNlLWZvcndhcmQgbmwtYnV0dG9uXFxcIj5cXG4gICAgICAgIHt7dHJhbnNsYXRlLmFwcGVhcmFuY2UuYnV0dG9ucy5mb3J3YXJkfX1cXG4gICAgICA8L2Rpdj5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJhcHBlYXJhbmNlLWJhY2t3YXJkIG5sLWJ1dHRvblxcXCI+XFxuICAgICAgICB7e3RyYW5zbGF0ZS5hcHBlYXJhbmNlLmJ1dHRvbnMuYmFja3dhcmR9fVxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gIDwvZGl2PlxcbjwvZGl2PlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGRpdlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgaWQ9XFxcImFwcGVhcmFuY2UtaXRlbXMtZ3JvdXAtXCIpO3QuYih0LnYodC5mKFwiZ3JvdXBcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeVxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGRhdGEtY2F0ZWdvcnlpZD1cXFwiXCIpO3QuYih0LnYodC5mKFwiY2F0ZWdvcnlpZFwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGRhdGEtY2F0ZWdvcnk9XFxcIlwiKTt0LmIodC52KHQuZihcImNhdGVnb3J5XCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDx1bCBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtcy1saXN0XFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgXCIpO3QuYih0LnQodC5mKFwiaXRlbXNcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPC91bD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8ZGl2XFxuICBpZD1cXFwiYXBwZWFyYW5jZS1pdGVtcy1ncm91cC17e2dyb3VwfX1cXFwiXFxuICBjbGFzcz1cXFwiYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeVxcXCJcXG4gIGRhdGEtY2F0ZWdvcnlpZD1cXFwie3tjYXRlZ29yeWlkfX1cXFwiXFxuICBkYXRhLWNhdGVnb3J5PVxcXCJ7e2NhdGVnb3J5fX1cXFwiXFxuPlxcbiAgPHVsIGNsYXNzPVxcXCJhcHBlYXJhbmNlLWl0ZW1zLWxpc3RcXFwiPlxcbiAgICB7e3tpdGVtc319fVxcbiAgPC91bD5cXG48L2Rpdj5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxkaXZcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGlkPVxcXCJtYXJrZXRwbGFjZS1pdGVtRGV0YWlsLWluZm8tYXV0b2J1eVxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIHN0eWxlPVxcXCJ0ZXh0LWFsaWduOiBjZW50ZXI7IG1hcmdpbjogMjBweCBhdXRvXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDxkaXYgY2xhc3M9XFxcIm5sLWJ1dHRvblxcXCI+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC5hZGRfdG9fd2lzaGxpc3QudGl0bGVcIixjLHAsMCkpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8ZGl2XFxuICBpZD1cXFwibWFya2V0cGxhY2UtaXRlbURldGFpbC1pbmZvLWF1dG9idXlcXFwiXFxuICBzdHlsZT1cXFwidGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW46IDIwcHggYXV0b1xcXCJcXG4+XFxuICA8ZGl2IGNsYXNzPVxcXCJubC1idXR0b25cXFwiPnt7dHJhbnNsYXRlLm1hcmtldC5hZGRfdG9fd2lzaGxpc3QudGl0bGV9fTwvZGl2PlxcbjwvZGl2PlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGgxPlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQuYWRkX3RvX3dpc2hsaXN0LnRpdGxlXCIsYyxwLDApKSk7dC5iKFwiPC9oMT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8cD5cIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0LmFkZF90b193aXNobGlzdC50ZXh0XCIsYyxwLDApKSk7dC5iKFwiPC9wPlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxoMT57e3RyYW5zbGF0ZS5tYXJrZXQuYWRkX3RvX3dpc2hsaXN0LnRpdGxlfX08L2gxPlxcbjxwPnt7dHJhbnNsYXRlLm1hcmtldC5hZGRfdG9fd2lzaGxpc3QudGV4dH19PC9wPlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGgxPlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYWxsLmFkZF90b193aXNobGlzdC50aXRsZVwiLGMscCwwKSkpO3QuYihcIjwvaDE+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPHA+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hbGwuYWRkX3RvX3dpc2hsaXN0LnRleHRcIixjLHAsMCkpKTt0LmIoXCI8L3A+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPHAgc3R5bGU9XFxcImZvbnQtc2l6ZTogMTRweFxcXCI+PGVtPlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYWxsLmFkZF90b193aXNobGlzdC5ub3RlXCIsYyxwLDApKSk7dC5iKFwiPC9lbT48L3A+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGgxPnt7dHJhbnNsYXRlLm1hbGwuYWRkX3RvX3dpc2hsaXN0LnRpdGxlfX08L2gxPlxcbjxwPnt7dHJhbnNsYXRlLm1hbGwuYWRkX3RvX3dpc2hsaXN0LnRleHR9fTwvcD5cXG48cCBzdHlsZT1cXFwiZm9udC1zaXplOiAxNHB4XFxcIj48ZW0+e3t0cmFuc2xhdGUubWFsbC5hZGRfdG9fd2lzaGxpc3Qubm90ZX19PC9lbT48L3A+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8YnV0dG9uXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBpZD1cXFwiYXV0by1leHBsb3JlLWJ1dHRvblxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGNsYXNzPVxcXCJubC1idXR0b24gXCIpO2lmKHQucyh0LmYoXCJhY3RpdmVcIixjLHAsMSksYyxwLDAsNjUsNzEsXCJ7eyB9fVwiKSl7dC5ycyhjLHAsZnVuY3Rpb24oYyxwLHQpe3QuYihcImFjdGl2ZVwiKTt9KTtjLnBvcCgpO310LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBkYXRhLWlkPVxcXCJcIik7dC5iKHQudih0LmYoXCJsb2NhdGlvbklkXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgZGF0YS1tYXBpZD1cXFwiXCIpO3QuYih0LnYodC5mKFwicmVnaW9uSWRcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLnBldC5hdXRvX2V4cGxvcmVcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvYnV0dG9uPlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxidXR0b25cXG4gIGlkPVxcXCJhdXRvLWV4cGxvcmUtYnV0dG9uXFxcIlxcbiAgY2xhc3M9XFxcIm5sLWJ1dHRvbiB7eyNhY3RpdmV9fWFjdGl2ZXt7L2FjdGl2ZX19XFxcIlxcbiAgZGF0YS1pZD1cXFwie3tsb2NhdGlvbklkfX1cXFwiXFxuICBkYXRhLW1hcGlkPVxcXCJ7e3JlZ2lvbklkfX1cXFwiXFxuPlxcbiAge3t0cmFuc2xhdGUucGV0LmF1dG9fZXhwbG9yZX19XFxuPC9idXR0b24+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8YVwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgaWQ9XFxcIlwiKTt0LmIodC52KHQuZihcImlkXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgY2xhc3M9XFxcImNhcm91c2VsLW5ld3MgY2Fyb3VzZWwtZWVcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBocmVmPVxcXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBzdHlsZT1cXFwiYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiKTt0LmIodC52KHQuZihcImJhY2tncm91bmRJbWFnZVwiLGMscCwwKSkpO3QuYihcIilcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGRpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGg0PlwiKTt0LmIodC52KHQuZihcImg0XCIsYyxwLDApKSk7dC5iKFwiPC9oND5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGg1PlwiKTt0LmIodC52KHQuZihcImg1XCIsYyxwLDApKSk7dC5iKFwiPC9oNT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPHA+XCIpO3QuYih0LnYodC5mKFwicFwiLGMscCwwKSkpO3QuYihcIjwvcD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvYT5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8YVxcbiAgaWQ9XFxcInt7aWR9fVxcXCJcXG4gIGNsYXNzPVxcXCJjYXJvdXNlbC1uZXdzIGNhcm91c2VsLWVlXFxcIlxcbiAgaHJlZj1cXFwiXFxcIlxcbiAgc3R5bGU9XFxcImJhY2tncm91bmQtaW1hZ2U6IHVybCh7e2JhY2tncm91bmRJbWFnZX19KVxcXCJcXG4+XFxuICA8ZGl2PlxcbiAgICA8aDQ+e3toNH19PC9oND5cXG4gICAgPGg1Pnt7aDV9fTwvaDU+XFxuICAgIDxwPnt7cH19PC9wPlxcbiAgPC9kaXY+XFxuPC9hPlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGgxPlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQuY2hhbmdlX3ByaWNlLnRpdGxlXCIsYyxwLDApKSk7dC5iKFwiPC9oMT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8cD5cIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0LmNoYW5nZV9wcmljZS50ZXh0XCIsYyxwLDApKSk7dC5iKFwiPC9wPlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxoMT57e3RyYW5zbGF0ZS5tYXJrZXQuY2hhbmdlX3ByaWNlLnRpdGxlfX08L2gxPlxcbjxwPnt7dHJhbnNsYXRlLm1hcmtldC5jaGFuZ2VfcHJpY2UudGV4dH19PC9wPlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGgxPlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuc2F2ZV9vdXRmaXQudGl0bGVcIixjLHAsMCkpKTt0LmIoXCI8L2gxPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8cD5cIik7dC5iKHQudCh0LmQoXCJ0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLnNhdmVfb3V0Zml0LnNhdmVkX2xvY2FsbHlcIixjLHAsMCkpKTt0LmIoXCI8L3A+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjxiciAvPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8cD5cIik7dC5iKHQudCh0LmQoXCJ0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLnNhdmVfb3V0Zml0LmdvdG9fYWNjb3VudFwiLGMscCwwKSkpO3QuYihcIjwvcD5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPGlucHV0XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBpZD1cXFwiY2hvb3NlLW5hbWVcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBtYXhsZW5ndGg9XFxcIjMwXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgbWlubGVuZ3RoPVxcXCIxXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgcGxhY2Vob2xkZXI9XFxcIlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuc2F2ZV9vdXRmaXQucGxhY2Vob2xkZXJcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiLz5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8aDE+e3t0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLnNhdmVfb3V0Zml0LnRpdGxlfX08L2gxPlxcblxcbjxwPnt7e3RyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuc2F2ZV9vdXRmaXQuc2F2ZWRfbG9jYWxseX19fTwvcD5cXG5cXG48YnIgLz5cXG5cXG48cD57e3t0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLnNhdmVfb3V0Zml0LmdvdG9fYWNjb3VudH19fTwvcD5cXG5cXG48aW5wdXRcXG4gIGlkPVxcXCJjaG9vc2UtbmFtZVxcXCJcXG4gIG1heGxlbmd0aD1cXFwiMzBcXFwiXFxuICBtaW5sZW5ndGg9XFxcIjFcXFwiXFxuICBwbGFjZWhvbGRlcj1cXFwie3t0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLnNhdmVfb3V0Zml0LnBsYWNlaG9sZGVyfX1cXFwiXFxuLz5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxkaXYgaWQ9XFxcImhpc3RvcnktY29udGFpbmVyXFxcIiBzdHlsZT1cXFwid2lkdGg6IDEwMCVcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPHN0eWxlPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAuaGlzdG9yeS1hY3Rpb25zIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBtYXJnaW4tYm90dG9tOiAxZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICNkZWxldGUtaGlzdG9yeSB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgbWFyZ2luLXJpZ2h0OiAxZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIC5oZWxwLWljb24ge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMwMjkxZjY7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgY29sb3I6ICNmZmY7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZm9udC1zaXplOiAyNnB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGhlaWdodDogMjNweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBsaW5lLWhlaWdodDogMjBweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBwYWRkaW5nOiAwO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB3aWR0aDogMjNweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgLmhpc3RvcnktbWVzc2FnZSB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBtYXJnaW46IDFlbTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBwYWRkaW5nOiAxZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIC5oaXN0b3J5LXJvdyB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZGlzcGxheTogZmxleDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmbGV4LXdyYXA6IHdyYXA7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgaGVpZ2h0OiA0NjVweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBtYXJnaW4tcmlnaHQ6IDFlbTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBvdmVyZmxvdy15OiBhdXRvO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHNjcm9sbGJhci1jb2xvcjogZGFyaztcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIC5yZXN1bHQtY2FyZCB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYm9yZGVyLXJhZGl1czogMWVtO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJveC1zaGFkb3c6IDAgMCA1cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBoZWlnaHQ6IDIwNXB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIG1hcmdpbjogMC41ZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgcGFkZGluZzogMC41ZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHdpZHRoOiAxMjhweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgLnJlc3VsdC1pbWFnZSB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYm9yZGVyLXJhZGl1czogMWVtO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJveC1zaGFkb3c6IDAgMCA0cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLFwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgMCAycHggNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDgpO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGhlaWdodDogMTAwcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRvcDogLTAuOGVtO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHdpZHRoOiAxMDBweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgLnJlc3VsdC1jb250ZW50LWNvbHVtbiB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZGlzcGxheTogZmxleDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGhlaWdodDogMTAzcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAucmVzdWx0LW5hbWUge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgLXdlYmtpdC1saW5lLWNsYW1wOiAzO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGNvbG9yOiByZ2IoNTIsIDU2LCAxMTEpO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGRpc3BsYXk6IC13ZWJraXQtYm94O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZsZXgtZ3JvdzogMTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmb250LXNpemU6IDE2cHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgbWFyZ2luLXRvcDogLTAuMmVtO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIG92ZXJmbG93OiBoaWRkZW47XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIC5yZXN1bHQtbG9jYXRpb24ge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAucmVzdWx0LWRhdGUge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGNvbG9yOiAjZmI4OTAwO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZvbnQtc2l6ZTogMTNweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmb250LXdlaWdodDogYm9sZDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgLnJlc3VsdC1pY29ucyB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgbWFyZ2luLXRvcDogMC41ZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIC5yZXN1bHQtY291bnQge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMDBjZGZiO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgY29sb3I6ICMzZWMwZDc7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZvbnQtZmFtaWx5OiBcXFwiQWxlZ3JleWEgU2FucyBTQ1xcXCIsIHNhbnMtc2VyaWY7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZm9udC1zaXplOiAxOHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZvbnQtd2VpZ2h0OiA4MDA7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgaGVpZ2h0OiAyOXB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGxpbmUtaGVpZ2h0OiAyN3B4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB3aWR0aDogMjlweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgLmhpc3RvcnktdHJhZGFibGUge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJhY2tncm91bmQtY29sb3I6ICM2NjY7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYm9yZGVyLXJhZGl1czogMjVweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBib3JkZXI6IDFweCBzb2xpZCAjYjliOWI5O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGNvbG9yOiAjZmZmZmZmO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmb250LWZhbWlseTogXFxcIlRlbXAgTWVudVxcXCIsIHNlcmlmO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZvbnQtc2l6ZTogMTNweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBoZWlnaHQ6IDE1cHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgbGluZS1oZWlnaHQ6IDE1cHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHdpZHRoOiAxNXB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAuaWNvbi1zcGFjZXIge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB3aWR0aDogMC4xZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvc3R5bGU+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGRpdiBjbGFzcz1cXFwiaGlzdG9yeS1hY3Rpb25zXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGJ1dHRvbiBpZD1cXFwiZGVsZXRlLWhpc3RvcnlcXFwiIGNsYXNzPVxcXCJubC1idXR0b25cXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5wZXQuZGVsZXRlX2hpc3RvcnlcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8L2J1dHRvbj5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxzcGFuIGNsYXNzPVxcXCJ0b29sdGlwXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8c3BhbiBjbGFzcz1cXFwibmwtYnV0dG9uIGhlbHAtaWNvblxcXCI+Pzwvc3Bhbj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8ZGl2IGNsYXNzPVxcXCJ0b29sdGlwLWNvbnRlbnRcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPHA+XCIpO3QuYih0LnQodC5kKFwidHJhbnNsYXRlLnBldC5zYXZlZF9sb2NhbGx5XCIsYyxwLDApKSk7dC5iKFwiPC9wPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPHA+XCIpO3QuYih0LnQodC5kKFwidHJhbnNsYXRlLnBldC5nb3RvX2FjY291bnRcIixjLHAsMCkpKTt0LmIoXCI8L3A+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDwvc3Bhbj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTtpZighdC5zKHQuZihcImhpc3RvcnlcIixjLHAsMSksYyxwLDEsMCwwLFwiXCIpKXt0LmIoXCIgIDxwIGNsYXNzPVxcXCJoaXN0b3J5LW1lc3NhZ2VcXFwiPlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5wZXQuZW1wdHlfaGlzdG9yeVwiLGMscCwwKSkpO3QuYihcIjwvcD5cIik7dC5iKFwiXFxuXCIgKyBpKTt9O3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8ZGl2IGNsYXNzPVxcXCJoaXN0b3J5LXJvd1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7aWYodC5zKHQuZihcImhpc3RvcnlcIixjLHAsMSksYyxwLDAsMzIzMCwzODYzLFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCIgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LWNhcmRcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDxpbWcgY2xhc3M9XFxcInJlc3VsdC1pbWFnZVxcXCIgc3JjPVxcXCJcIik7dC5iKHQudih0LmYoXCJpY29uXCIsYyxwLDApKSk7dC5iKFwiXFxcIiAvPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8ZGl2IGNsYXNzPVxcXCJyZXN1bHQtY29udGVudC1jb2x1bW5cXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LW5hbWVcXFwiPlwiKTt0LmIodC52KHQuZihcIm5hbWVcIixjLHAsMCkpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxkaXYgY2xhc3M9XFxcInJlc3VsdC1sb2NhdGlvblxcXCI+XCIpO3QuYih0LnYodC5mKFwibG9jYXRpb25OYW1lXCIsYyxwLDApKSk7dC5iKFwiPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJyZXN1bHQtZGF0ZVxcXCI+XCIpO3QuYih0LnYodC5mKFwiZGF0ZVwiLGMscCwwKSkpO3QuYihcIjwvZGl2PlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxkaXYgY2xhc3M9XFxcInJlc3VsdC1pY29uc1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIFwiKTtpZih0LnModC5mKFwiY291bnRcIixjLHAsMSksYyxwLDAsMzU2NiwzNjA5LFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCI8c3BhbiBjbGFzcz1cXFwicmVzdWx0LWNvdW50XFxcIj5cIik7dC5iKHQudih0LmYoXCJjb3VudFwiLGMscCwwKSkpO3QuYihcIjwvc3Bhbj5cIik7fSk7Yy5wb3AoKTt9dC5iKFwiXFxuXCIgKyBpKTtpZih0LnModC5mKFwiY291bnRcIixjLHAsMSksYyxwLDAsMzY0MCwzNzE5LFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXtpZih0LnModC5mKFwidHJhZGFibGVcIixjLHAsMSksYyxwLDAsMzY1MywzNzA2LFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCIgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiaWNvbi1zcGFjZXJcXFwiPjwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICBcIik7fSk7Yy5wb3AoKTt9fSk7Yy5wb3AoKTt9dC5iKFwiIFwiKTtpZih0LnModC5mKFwidHJhZGFibGVcIixjLHAsMSksYyxwLDAsMzc0MywzODA2LFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCI8c3BhbiBjbGFzcz1cXFwiaGlzdG9yeS10cmFkYWJsZVxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgICA+7qCCPC9zcGFuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgID5cIik7fSk7Yy5wb3AoKTt9dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt9KTtjLnBvcCgpO310LmIoXCIgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvZGl2PlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxkaXYgaWQ9XFxcImhpc3RvcnktY29udGFpbmVyXFxcIiBzdHlsZT1cXFwid2lkdGg6IDEwMCVcXFwiPlxcbiAgPHN0eWxlPlxcbiAgICAuaGlzdG9yeS1hY3Rpb25zIHtcXG4gICAgICBtYXJnaW4tYm90dG9tOiAxZW07XFxuICAgIH1cXG5cXG4gICAgI2RlbGV0ZS1oaXN0b3J5IHtcXG4gICAgICBtYXJnaW4tcmlnaHQ6IDFlbTtcXG4gICAgfVxcblxcbiAgICAuaGVscC1pY29uIHtcXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDI5MWY2O1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcXG4gICAgICBib3gtc2hhZG93OiBub25lO1xcbiAgICAgIGNvbG9yOiAjZmZmO1xcbiAgICAgIGZvbnQtc2l6ZTogMjZweDtcXG4gICAgICBmb250LXdlaWdodDogYm9sZDtcXG4gICAgICBoZWlnaHQ6IDIzcHg7XFxuICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7XFxuICAgICAgcGFkZGluZzogMDtcXG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgICAgd2lkdGg6IDIzcHg7XFxuICAgIH1cXG5cXG4gICAgLmhpc3RvcnktbWVzc2FnZSB7XFxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTtcXG4gICAgICBtYXJnaW46IDFlbTtcXG4gICAgICBwYWRkaW5nOiAxZW07XFxuICAgIH1cXG5cXG4gICAgLmhpc3Rvcnktcm93IHtcXG4gICAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcXG4gICAgICBoZWlnaHQ6IDQ2NXB4O1xcbiAgICAgIG1hcmdpbi1yaWdodDogMWVtO1xcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XFxuICAgICAgc2Nyb2xsYmFyLWNvbG9yOiBkYXJrO1xcbiAgICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjtcXG4gICAgfVxcblxcbiAgICAucmVzdWx0LWNhcmQge1xcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTtcXG4gICAgICBib3gtc2hhZG93OiAwIDAgNXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMyk7XFxuICAgICAgaGVpZ2h0OiAyMDVweDtcXG4gICAgICBtYXJnaW46IDAuNWVtO1xcbiAgICAgIHBhZGRpbmc6IDAuNWVtO1xcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgICB3aWR0aDogMTI4cHg7XFxuICAgIH1cXG5cXG4gICAgLnJlc3VsdC1pbWFnZSB7XFxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgICAgYm9yZGVyLXJhZGl1czogMWVtO1xcbiAgICAgIGJveC1zaGFkb3c6IDAgMCA0cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLFxcbiAgICAgICAgMCAycHggNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDgpO1xcbiAgICAgIGhlaWdodDogMTAwcHg7XFxuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICAgIHRvcDogLTAuOGVtO1xcbiAgICAgIHdpZHRoOiAxMDBweDtcXG4gICAgfVxcblxcbiAgICAucmVzdWx0LWNvbnRlbnQtY29sdW1uIHtcXG4gICAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgICAgaGVpZ2h0OiAxMDNweDtcXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIH1cXG5cXG4gICAgLnJlc3VsdC1uYW1lIHtcXG4gICAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xcbiAgICAgIC13ZWJraXQtbGluZS1jbGFtcDogMztcXG4gICAgICBjb2xvcjogcmdiKDUyLCA1NiwgMTExKTtcXG4gICAgICBkaXNwbGF5OiAtd2Via2l0LWJveDtcXG4gICAgICBmbGV4LWdyb3c6IDE7XFxuICAgICAgZm9udC1zaXplOiAxNnB4O1xcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgICAgIG1hcmdpbi10b3A6IC0wLjJlbTtcXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICB9XFxuXFxuICAgIC5yZXN1bHQtbG9jYXRpb24ge1xcbiAgICB9XFxuXFxuICAgIC5yZXN1bHQtZGF0ZSB7XFxuICAgICAgY29sb3I6ICNmYjg5MDA7XFxuICAgICAgZm9udC1zaXplOiAxM3B4O1xcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgICB9XFxuXFxuICAgIC5yZXN1bHQtaWNvbnMge1xcbiAgICAgIG1hcmdpbi10b3A6IDAuNWVtO1xcbiAgICB9XFxuXFxuICAgIC5yZXN1bHQtY291bnQge1xcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XFxuICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTtcXG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjMDBjZGZiO1xcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgICAgY29sb3I6ICMzZWMwZDc7XFxuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICAgIGZvbnQtZmFtaWx5OiBcXFwiQWxlZ3JleWEgU2FucyBTQ1xcXCIsIHNhbnMtc2VyaWY7XFxuICAgICAgZm9udC1zaXplOiAxOHB4O1xcbiAgICAgIGZvbnQtd2VpZ2h0OiA4MDA7XFxuICAgICAgaGVpZ2h0OiAyOXB4O1xcbiAgICAgIGxpbmUtaGVpZ2h0OiAyN3B4O1xcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgICB3aWR0aDogMjlweDtcXG4gICAgfVxcblxcbiAgICAuaGlzdG9yeS10cmFkYWJsZSB7XFxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzY2NjtcXG4gICAgICBib3JkZXItcmFkaXVzOiAyNXB4O1xcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiOWI5Yjk7XFxuICAgICAgY29sb3I6ICNmZmZmZmY7XFxuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICAgIGZvbnQtZmFtaWx5OiBcXFwiVGVtcCBNZW51XFxcIiwgc2VyaWY7XFxuICAgICAgZm9udC1zaXplOiAxM3B4O1xcbiAgICAgIGhlaWdodDogMTVweDtcXG4gICAgICBsaW5lLWhlaWdodDogMTVweDtcXG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgICAgd2lkdGg6IDE1cHg7XFxuICAgIH1cXG5cXG4gICAgLmljb24tc3BhY2VyIHtcXG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgICAgd2lkdGg6IDAuMWVtO1xcbiAgICB9XFxuICA8L3N0eWxlPlxcblxcbiAgPGRpdiBjbGFzcz1cXFwiaGlzdG9yeS1hY3Rpb25zXFxcIj5cXG4gICAgPGJ1dHRvbiBpZD1cXFwiZGVsZXRlLWhpc3RvcnlcXFwiIGNsYXNzPVxcXCJubC1idXR0b25cXFwiPlxcbiAgICAgIHt7dHJhbnNsYXRlLnBldC5kZWxldGVfaGlzdG9yeX19XFxuICAgIDwvYnV0dG9uPlxcblxcbiAgICA8c3BhbiBjbGFzcz1cXFwidG9vbHRpcFxcXCI+XFxuICAgICAgPHNwYW4gY2xhc3M9XFxcIm5sLWJ1dHRvbiBoZWxwLWljb25cXFwiPj88L3NwYW4+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwidG9vbHRpcC1jb250ZW50XFxcIj5cXG4gICAgICAgIDxwPnt7e3RyYW5zbGF0ZS5wZXQuc2F2ZWRfbG9jYWxseX19fTwvcD5cXG4gICAgICAgIDxwPnt7e3RyYW5zbGF0ZS5wZXQuZ290b19hY2NvdW50fX19PC9wPlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L3NwYW4+XFxuICA8L2Rpdj5cXG5cXG4gIHt7Xmhpc3Rvcnl9fVxcbiAgPHAgY2xhc3M9XFxcImhpc3RvcnktbWVzc2FnZVxcXCI+e3t0cmFuc2xhdGUucGV0LmVtcHR5X2hpc3Rvcnl9fTwvcD5cXG4gIHt7L2hpc3Rvcnl9fVxcblxcbiAgPGRpdiBjbGFzcz1cXFwiaGlzdG9yeS1yb3dcXFwiPlxcbiAgICB7eyNoaXN0b3J5fX1cXG4gICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LWNhcmRcXFwiPlxcbiAgICAgIDxpbWcgY2xhc3M9XFxcInJlc3VsdC1pbWFnZVxcXCIgc3JjPVxcXCJ7e2ljb259fVxcXCIgLz5cXG5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJyZXN1bHQtY29udGVudC1jb2x1bW5cXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LW5hbWVcXFwiPnt7bmFtZX19PC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJyZXN1bHQtbG9jYXRpb25cXFwiPnt7bG9jYXRpb25OYW1lfX08L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInJlc3VsdC1kYXRlXFxcIj57e2RhdGV9fTwvZGl2PlxcblxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LWljb25zXFxcIj5cXG4gICAgICAgICAge3sjY291bnR9fTxzcGFuIGNsYXNzPVxcXCJyZXN1bHQtY291bnRcXFwiPnt7Y291bnR9fTwvc3Bhbj57ey9jb3VudH19XFxuICAgICAgICAgIHt7I2NvdW50fX17eyN0cmFkYWJsZX19XFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImljb24tc3BhY2VyXFxcIj48L2Rpdj5cXG4gICAgICAgICAge3svdHJhZGFibGV9fXt7L2NvdW50fX0ge3sjdHJhZGFibGV9fTxzcGFuIGNsYXNzPVxcXCJoaXN0b3J5LXRyYWRhYmxlXFxcIlxcbiAgICAgICAgICAgID7uoII8L3NwYW5cXG4gICAgICAgICAgPnt7L3RyYWRhYmxlfX1cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gICAge3svaGlzdG9yeX19XFxuICA8L2Rpdj5cXG48L2Rpdj5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxzdHlsZT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIC5jcmVhdGVkLW91dGZpdC1wb3B1cCAuZmxhdnItb3V0ZXIgLmZsYXZyLW1lc3NhZ2U6OmFmdGVyIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiKTt0LmIodC52KHQuZihcInVybFwiLGMscCwwKSkpO3QuYihcIik7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIH1cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L3N0eWxlPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8aDE+XCIpO3QuYih0LnYodC5mKFwibmFtZVwiLGMscCwwKSkpO3QuYihcIjwvaDE+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjxwPlwiKTt0LmIodC50KHQuZChcInRyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuY2xpY2tfb3V0Zml0LnNhdmVkX2xvY2FsbHlcIixjLHAsMCkpKTt0LmIoXCI8L3A+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjxiciAvPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8cD5cIik7dC5iKHQudCh0LmQoXCJ0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLmNsaWNrX291dGZpdC5nb3RvX2FjY291bnRcIixjLHAsMCkpKTt0LmIoXCI8L3A+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPHN0eWxlPlxcbiAgLmNyZWF0ZWQtb3V0Zml0LXBvcHVwIC5mbGF2ci1vdXRlciAuZmxhdnItbWVzc2FnZTo6YWZ0ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoe3t1cmx9fSk7XFxuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcXG4gIH1cXG48L3N0eWxlPlxcblxcbjxoMT57e25hbWV9fTwvaDE+XFxuXFxuPHA+e3t7dHJhbnNsYXRlLmFwcGVhcmFuY2UuZmF2b3VyaXRlcy5jbGlja19vdXRmaXQuc2F2ZWRfbG9jYWxseX19fTwvcD5cXG5cXG48YnIgLz5cXG5cXG48cD57e3t0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLmNsaWNrX291dGZpdC5nb3RvX2FjY291bnR9fX08L3A+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8YnV0dG9uIGlkPVxcXCJcIik7dC5iKHQudih0LmYoXCJpZFwiLGMscCwwKSkpO3QuYihcIlxcXCIgY2xhc3M9XFxcIm5sLWJ1dHRvbiBmYXZvcml0ZXMtYWN0aW9uLWVlXFxcIj5cIik7dC5iKHQudih0LmYoXCJ0ZXh0XCIsYyxwLDApKSk7dC5iKFwiPC9idXR0b24+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGJ1dHRvbiBpZD1cXFwie3tpZH19XFxcIiBjbGFzcz1cXFwibmwtYnV0dG9uIGZhdm9yaXRlcy1hY3Rpb24tZWVcXFwiPnt7dGV4dH19PC9idXR0b24+XFxuXCIsIEgpO3JldHVybiBUOyB9KCk7IiwidmFyIEggPSByZXF1aXJlKFwiaG9nYW4uanNcIik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgeyB2YXIgVCA9IG5ldyBILlRlbXBsYXRlKHtjb2RlOiBmdW5jdGlvbiAoYyxwLGkpIHsgdmFyIHQ9dGhpczt0LmIoaT1pfHxcIlwiKTt0LmIoXCI8aW1nXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBzcmM9XFxcIlwiKTt0LmIodC52KHQuZihcImljb25cIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBhbHQ9XFxcIlwiKTt0LmIodC52KHQuZihcIm5hbWVcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBoZWlnaHQ9XFxcIjIxXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgc3R5bGU9XFxcImRpc3BsYXk6IGlubGluZS1ibG9jazsgbWFyZ2luOiAtMnB4IGF1dG9cXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiLz5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIodC50KHQuZihcIm1lc3NhZ2VcIixjLHAsMCkpKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxpbWdcXG4gIHNyYz1cXFwie3tpY29ufX1cXFwiXFxuICBhbHQ9XFxcInt7bmFtZX19XFxcIlxcbiAgaGVpZ2h0PVxcXCIyMVxcXCJcXG4gIHN0eWxlPVxcXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbjogLTJweCBhdXRvXFxcIlxcbi8+XFxue3t7bWVzc2FnZX19fVxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGxpXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBpZD1cXFwiaGVhZGVyLXRha2VvdmVyXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgdGl0bGU9XFxcIlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5ob21lLnRha2VvdmVyXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgc3R5bGU9XFxcInRyYW5zaXRpb246IHRyYW5zZm9ybSBlYXNlLWluLW91dCAyMDBtczsgY3Vyc29yOiBwb2ludGVyXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgb25Nb3VzZU92ZXI9XFxcInRoaXMuc3R5bGUudHJhbnNmb3JtPSdzY2FsZSgxLjMpJ1xcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIG9uTW91c2VPdXQ9XFxcInRoaXMuc3R5bGUudHJhbnNmb3JtPSdzY2FsZSgxKSdcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGE+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxpbWdcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBzcmM9XFxcIi9zdGF0aWMvaW1nL25ldy1sYXlvdXQvaG9tZS9jb25uZWN0ZWQvbG9jay5wbmdcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYWx0PVxcXCJcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUuaG9tZS50YWtlb3ZlclwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBzdHlsZT1cXFwiZmlsdGVyOiBjb250cmFzdCgwJSkgYnJpZ2h0bmVzcygyMDAlKSBcIik7aWYoIXQucyh0LmYoXCJ0YWtlb3ZlclwiLGMscCwxKSxjLHAsMSwwLDAsXCJcIikpe3QuYihcIm9wYWNpdHkoMClcIik7fTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgaGVpZ2h0PVxcXCIyMVxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgLz5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvYT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2xpPlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxsaVxcbiAgaWQ9XFxcImhlYWRlci10YWtlb3ZlclxcXCJcXG4gIHRpdGxlPVxcXCJ7e3RyYW5zbGF0ZS5ob21lLnRha2VvdmVyfX1cXFwiXFxuICBzdHlsZT1cXFwidHJhbnNpdGlvbjogdHJhbnNmb3JtIGVhc2UtaW4tb3V0IDIwMG1zOyBjdXJzb3I6IHBvaW50ZXJcXFwiXFxuICBvbk1vdXNlT3Zlcj1cXFwidGhpcy5zdHlsZS50cmFuc2Zvcm09J3NjYWxlKDEuMyknXFxcIlxcbiAgb25Nb3VzZU91dD1cXFwidGhpcy5zdHlsZS50cmFuc2Zvcm09J3NjYWxlKDEpJ1xcXCJcXG4+XFxuICA8YT5cXG4gICAgPGltZ1xcbiAgICAgIHNyYz1cXFwiL3N0YXRpYy9pbWcvbmV3LWxheW91dC9ob21lL2Nvbm5lY3RlZC9sb2NrLnBuZ1xcXCJcXG4gICAgICBhbHQ9XFxcInt7dHJhbnNsYXRlLmhvbWUudGFrZW92ZXJ9fVxcXCJcXG4gICAgICBzdHlsZT1cXFwiZmlsdGVyOiBjb250cmFzdCgwJSkgYnJpZ2h0bmVzcygyMDAlKSB7e150YWtlb3Zlcn19b3BhY2l0eSgwKXt7L3Rha2VvdmVyfX1cXFwiXFxuICAgICAgaGVpZ2h0PVxcXCIyMVxcXCJcXG4gICAgLz5cXG4gIDwvYT5cXG48L2xpPlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGFcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGlkPVxcXCJob21lLVwiKTt0LmIodC52KHQuZihcImlkXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgY2xhc3M9XFxcImhvbWUtY29udGVudC10aWxlIGhvbWUtY29udGVudC1zbWFsbCBob21lLWNvbnRlbnQtc21hbGwtZWVcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBocmVmPVxcXCJcIik7dC5iKHQudih0LmYoXCJocmVmXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgc3R5bGU9XFxcImJhY2tncm91bmQtaW1hZ2U6IHVybChcIik7dC5iKHQudih0LmYoXCJiYWNrZ3JvdW5kSW1hZ2VcIixjLHAsMCkpKTt0LmIoXCIpO1xcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8aDQ+XCIpO3QuYih0LnYodC5mKFwiaDRcIixjLHAsMCkpKTt0LmIoXCI8L2g0PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvYT5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8YVxcbiAgaWQ9XFxcImhvbWUte3tpZH19XFxcIlxcbiAgY2xhc3M9XFxcImhvbWUtY29udGVudC10aWxlIGhvbWUtY29udGVudC1zbWFsbCBob21lLWNvbnRlbnQtc21hbGwtZWVcXFwiXFxuICBocmVmPVxcXCJ7e2hyZWZ9fVxcXCJcXG4gIHN0eWxlPVxcXCJiYWNrZ3JvdW5kLWltYWdlOiB1cmwoe3tiYWNrZ3JvdW5kSW1hZ2V9fSk7XFxcIlxcbj5cXG4gIDxoND57e2g0fX08L2g0PlxcbjwvYT5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxsaSBjbGFzcz1cXFwibWFpbi1tZW51LVwiKTt0LmIodC52KHQuZihcImNsYXNzXCIsYyxwLDApKSk7dC5iKFwiIG1haW4tbWVudS1lZVxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8YSBocmVmPVxcXCJcIik7dC5iKHQudih0LmYoXCJocmVmXCIsYyxwLDApKSk7dC5iKFwiXFxcIj5cIik7dC5iKHQudih0LmYoXCJ0ZXh0XCIsYyxwLDApKSk7dC5iKFwiPC9hPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvbGk+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGxpIGNsYXNzPVxcXCJtYWluLW1lbnUte3tjbGFzc319IG1haW4tbWVudS1lZVxcXCI+XFxuICA8YSBocmVmPVxcXCJ7e2hyZWZ9fVxcXCI+e3t0ZXh0fX08L2E+XFxuPC9saT5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxsaSBjbGFzcz1cXFwibWFpbi1tZW51LXB1cnJvc2hvcFxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8YSBocmVmPVxcXCIvbWFsbC9wdXJyb3Nob3BcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8aW1nXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgaGVpZ2h0PVxcXCIyMFxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBzcmM9XFxcIi9hc3NldHMvaW1nL2l0ZW0vY29uc3VtYWJsZS9iNjQ3ZDU0YWZkNmIwNDM1M2UxMjkyMTk4MTA1MTJmNS5wbmdcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGVcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIC8+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIFB1cnJvJ1Nob3BcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvYT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2xpPlwiKTt0LmIoXCJcXG5cIik7cmV0dXJuIHQuZmwoKTsgfSxwYXJ0aWFsczoge30sIHN1YnM6IHsgIH19LCBcIjxsaSBjbGFzcz1cXFwibWFpbi1tZW51LXB1cnJvc2hvcFxcXCI+XFxuICA8YSBocmVmPVxcXCIvbWFsbC9wdXJyb3Nob3BcXFwiPlxcbiAgICA8aW1nXFxuICAgICAgaGVpZ2h0PVxcXCIyMFxcXCJcXG4gICAgICBzcmM9XFxcIi9hc3NldHMvaW1nL2l0ZW0vY29uc3VtYWJsZS9iNjQ3ZDU0YWZkNmIwNDM1M2UxMjkyMTk4MTA1MTJmNS5wbmdcXFwiXFxuICAgICAgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGVcXFwiXFxuICAgIC8+XFxuICAgIFB1cnJvJ1Nob3BcXG4gIDwvYT5cXG48L2xpPlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPHN0eWxlPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgLyogI21hcmtldHBsYWNlLWFic3RyYWN0LXB1cmNoYXNlcyBhbmQgI21hcmtldHBsYWNlLWFic3RyYWN0LXNhbGVzIHdlcmVcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIHJlLXdyaXR0ZW4gdG8gdGFyZ2V0ICNwdXJjaGFzZS1oaXN0b3J5IGFuZCAjc2FsZS1oaXN0b3J5LiAqL1wiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICNwdXJjaGFzZS1oaXN0b3J5LFwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgI3NhbGUtaGlzdG9yeSB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGhlaWdodDogNjAwcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgd2lkdGg6IDM2MHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgI3NhbGUtaGlzdG9yeSAuYWJzdHJhY3QtYWN0aW9ucyxcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICNwdXJjaGFzZS1oaXN0b3J5IC5hYnN0cmFjdC1hY3Rpb25zIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgcG9zaXRpb246IHJlbGF0aXZlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB0b3A6IC00MHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBkaXNwbGF5OiBmbGV4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWV2ZW5seTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgaGVpZ2h0OiA4MHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICNzYWxlLWhpc3RvcnkgLmFic3RyYWN0LXRpbWUsXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAjcHVyY2hhc2UtaGlzdG9yeSAuYWJzdHJhY3QtdGltZSB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIHBvc2l0aW9uOiBzdGF0aWM7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGRpc3BsYXk6IGlubGluZTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgaGVpZ2h0OiBhdXRvO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBjb2xvcjogI2ZiODkwMDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGZvbnQtc2l6ZTogMTNweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAjcHVyY2hhc2UtaGlzdG9yeSB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIG1hcmdpbi1yaWdodDogODBweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAjcHVyY2hhc2UtaGlzdG9yeTpiZWZvcmUge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBjb250ZW50OiBcXFwiXFxcIjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgcG9zaXRpb246IGFic29sdXRlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB0b3A6IDEyMHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICByaWdodDogLTQycHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGJvcmRlci1yaWdodDogc29saWQgMnB4ICNhYWE7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGhlaWdodDogMzIwcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgLyogQ3VzdG9tIGZpeGVzIHRvIHRoZSBsYXlvdXQgKi9cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAjcHVyY2hhc2UtaGlzdG9yeSBsaSB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIG1hcmdpbi1sZWZ0OiA0cHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIG1hcmdpbi1yaWdodDogNHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgfVwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvc3R5bGU+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwhLS0gUHVyY2hhc2VzIC0tPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjxkaXYgY2xhc3M9XFxcIm1hcmtldHBsYWNlLWFic3RyYWN0XFxcIiBpZD1cXFwicHVyY2hhc2UtaGlzdG9yeVxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8aDIgY2xhc3M9XFxcInNlY3Rpb24tc3VidGl0bGVcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0LmF1Y3Rpb25zLnB1cmNoYXNlX2hpc3RvcnlcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPC9oMj5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8dWwgY2xhc3M9XFxcIm1hcmtldHBsYWNlLXB1cmNoYXNlcy1pdGVtc1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7aWYodC5zKHQuZihcInB1cmNoYXNlc1wiLGMscCwxKSxjLHAsMCwxMjg0LDI1NDUsXCJ7eyB9fVwiKSl7dC5ycyhjLHAsZnVuY3Rpb24oYyxwLHQpe3QuYihcIiAgICA8bGlcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBkYXRhLWl0ZW1pZD1cXFwiXCIpO3QuYih0LnYodC5mKFwiaXRlbWlkXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGNsYXNzPVxcXCJtYXJrZXRwbGFjZS1hYnN0cmFjdCBtYXJrZXRwbGFjZS1hdWN0aW9ucy1pdGVtIG1hcmtldHBsYWNlLXNhbGVzLWl0ZW1cXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgID5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8IS0tIEljb24gLS0+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtaWNvblxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8aW1nIHNyYz1cXFwiXCIpO3QuYih0LnYodC5mKFwiaWNvblwiLGMscCwwKSkpO3QuYihcIlxcXCIgLz5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPCEtLSBQcmljZXMgLS0+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtY29udGFpbmVyXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LW5hbWVcXFwiPlwiKTt0LmIodC52KHQuZihcIm5hbWVcIixjLHAsMCkpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LWNvbnRlbnRcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1jdXJyZW50UHJpY2VcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICAgIFwiKTtpZih0LnModC5mKFwiY3VycmVudFByaWNlXCIsYyxwLDEpLGMscCwwLDE3MzgsMTkwNyxcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQuYXVjdGlvbnMuY3VycmVudF9wcmljZVwiLGMscCwwKSkpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInByaWNlLWl0ZW1cXFwiPlwiKTt0LmIodC52KHQuZChcImN1cnJlbnRQcmljZS5wcmljZVwiLGMscCwwKSkpO3QuYihcIjwvc3Bhbj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWFhbmEtaWNvblxcXCI+PC9zcGFuPlwiKTt0LmIoXCJcXG5cIiArIGkpO30pO2MucG9wKCk7fXQuYihcIiAgICAgICAgICAgIDxiciAvPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICAgIFwiKTtpZih0LnModC5mKFwiYnV5Tm93UHJpY2VcIixjLHAsMSksYyxwLDAsMTk3MiwyMTQwLFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCIgXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC5hdWN0aW9ucy5idXlfbm93X3ByaWNlXCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwicHJpY2UtaXRlbVxcXCI+XCIpO3QuYih0LnYodC5kKFwiYnV5Tm93UHJpY2UucHJpY2VcIixjLHAsMCkpKTt0LmIoXCI8L3NwYW4+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1hYW5hLWljb25cXFwiPjwvc3Bhbj5cIik7dC5iKFwiXFxuXCIgKyBpKTt9KTtjLnBvcCgpO310LmIoXCIgICAgICAgICAgPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPCEtLSBBY3Rpb25zIC0tPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LWFjdGlvbnNcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtdGltZVxcXCI+XCIpO3QuYih0LnYodC5mKFwiZGF0ZVwiLGMscCwwKSkpO3QuYihcIjwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGRpdlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbSBtYXJrZXRwbGFjZS1pdGVtRGV0YWlsLWNhbmNlbCBkZWxldGUtYnV0dG9uXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICBkYXRhLWl0ZW1pZD1cXFwiXCIpO3QuYih0LnYodC5mKFwiaXRlbWlkXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICBcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0LmF1Y3Rpb25zLmRlbGV0ZVwiLGMscCwwKSkpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC9saT5cIik7dC5iKFwiXFxuXCIgKyBpKTt9KTtjLnBvcCgpO310LmIoXCIgIDwvdWw+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPC9kaXY+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwhLS0gU2FsZXMgLS0+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPGRpdiBjbGFzcz1cXFwibWFya2V0cGxhY2UtYWJzdHJhY3RcXFwiIGlkPVxcXCJzYWxlLWhpc3RvcnlcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGgyIGNsYXNzPVxcXCJzZWN0aW9uLXN1YnRpdGxlXFxcIj5cIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0LmF1Y3Rpb25zLnNhbGVzX2hpc3RvcnlcIixjLHAsMCkpKTt0LmIoXCI8L2gyPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDx1bCBjbGFzcz1cXFwibWFya2V0cGxhY2Utc2FsZXMtaXRlbXNcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO2lmKHQucyh0LmYoXCJzYWxlc1wiLGMscCwxKSxjLHAsMCwyNzc4LDM5MjQsXCJ7eyB9fVwiKSl7dC5ycyhjLHAsZnVuY3Rpb24oYyxwLHQpe3QuYihcIiAgICA8bGkgY2xhc3M9XFxcIm1hcmtldHBsYWNlLWFic3RyYWN0IG1hcmtldHBsYWNlLXNhbGVzLWl0ZW1cXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwhLS0gSWNvbiAtLT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1pY29uXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxpbWcgc3JjPVxcXCJcIik7dC5iKHQudih0LmYoXCJpY29uXCIsYyxwLDApKSk7dC5iKFwiXFxcIiAvPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8IS0tIFByaWNlcyAtLT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1jb250YWluZXJcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtbmFtZVxcXCI+XCIpO3QuYih0LnYodC5mKFwibmFtZVwiLGMscCwwKSkpO3QuYihcIjwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtY29udGVudFxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LWN1cnJlbnRQcmljZVxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgICAgXCIpO2lmKHQucyh0LmYoXCJjdXJyZW50UHJpY2VcIixjLHAsMSksYyxwLDAsMzE2NCwzMzI3LFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCIgXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC5hdWN0aW9ucy5jdXJyZW50X3ByaWNlXCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwicHJpY2UtaXRlbVxcXCI+XCIpO3QuYih0LnYodC5mKFwiY3VycmVudFByaWNlXCIsYyxwLDApKSk7dC5iKFwiPC9zcGFuPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYWFuYS1pY29uXFxcIj48L3NwYW4+XCIpO3QuYihcIlxcblwiICsgaSk7fSk7Yy5wb3AoKTt9dC5iKFwiICAgICAgICAgICAgPGJyIC8+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgICAgXCIpO2lmKHQucyh0LmYoXCJidXlOb3dQcmljZVwiLGMscCwxKSxjLHAsMCwzMzkyLDM1NTQsXCJ7eyB9fVwiKSl7dC5ycyhjLHAsZnVuY3Rpb24oYyxwLHQpe3QuYihcIiBcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0LmF1Y3Rpb25zLmJ1eV9ub3dfcHJpY2VcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJwcmljZS1pdGVtXFxcIj5cIik7dC5iKHQudih0LmYoXCJidXlOb3dQcmljZVwiLGMscCwwKSkpO3QuYihcIjwvc3Bhbj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWFhbmEtaWNvblxcXCI+PC9zcGFuPlwiKTt0LmIoXCJcXG5cIiArIGkpO30pO2MucG9wKCk7fXQuYihcIiAgICAgICAgICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8IS0tIEFjdGlvbnMgLS0+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtYWN0aW9uc1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC10aW1lXFxcIj5cIik7dC5iKHQudih0LmYoXCJkYXRlXCIsYyxwLDApKSk7dC5iKFwiPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8ZGl2XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtIG1hcmtldHBsYWNlLWl0ZW1EZXRhaWwtY2FuY2VsIGRlbGV0ZS1idXR0b25cXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQuYXVjdGlvbnMuZGVsZXRlXCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8L2xpPlwiKTt0LmIoXCJcXG5cIiArIGkpO30pO2MucG9wKCk7fXQuYihcIiAgPC91bD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8c3R5bGU+XFxuICAvKiAjbWFya2V0cGxhY2UtYWJzdHJhY3QtcHVyY2hhc2VzIGFuZCAjbWFya2V0cGxhY2UtYWJzdHJhY3Qtc2FsZXMgd2VyZVxcbiAgcmUtd3JpdHRlbiB0byB0YXJnZXQgI3B1cmNoYXNlLWhpc3RvcnkgYW5kICNzYWxlLWhpc3RvcnkuICovXFxuXFxuICAjcHVyY2hhc2UtaGlzdG9yeSxcXG4gICNzYWxlLWhpc3Rvcnkge1xcbiAgICBoZWlnaHQ6IDYwMHB4O1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHdpZHRoOiAzNjBweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcbiAgfVxcblxcbiAgI3NhbGUtaGlzdG9yeSAuYWJzdHJhY3QtYWN0aW9ucyxcXG4gICNwdXJjaGFzZS1oaXN0b3J5IC5hYnN0cmFjdC1hY3Rpb25zIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICB0b3A6IC00MHB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWV2ZW5seTtcXG4gICAgaGVpZ2h0OiA4MHB4O1xcbiAgfVxcblxcbiAgI3NhbGUtaGlzdG9yeSAuYWJzdHJhY3QtdGltZSxcXG4gICNwdXJjaGFzZS1oaXN0b3J5IC5hYnN0cmFjdC10aW1lIHtcXG4gICAgcG9zaXRpb246IHN0YXRpYztcXG4gICAgZGlzcGxheTogaW5saW5lO1xcbiAgICBoZWlnaHQ6IGF1dG87XFxuICAgIGNvbG9yOiAjZmI4OTAwO1xcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG4gICAgZm9udC1zaXplOiAxM3B4O1xcbiAgfVxcblxcbiAgI3B1cmNoYXNlLWhpc3Rvcnkge1xcbiAgICBtYXJnaW4tcmlnaHQ6IDgwcHg7XFxuICB9XFxuXFxuICAjcHVyY2hhc2UtaGlzdG9yeTpiZWZvcmUge1xcbiAgICBjb250ZW50OiBcXFwiXFxcIjtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IDEyMHB4O1xcbiAgICByaWdodDogLTQycHg7XFxuICAgIGJvcmRlci1yaWdodDogc29saWQgMnB4ICNhYWE7XFxuICAgIGhlaWdodDogMzIwcHg7XFxuICB9XFxuXFxuICAvKiBDdXN0b20gZml4ZXMgdG8gdGhlIGxheW91dCAqL1xcblxcbiAgI3B1cmNoYXNlLWhpc3RvcnkgbGkge1xcbiAgICBtYXJnaW4tbGVmdDogNHB4O1xcbiAgICBtYXJnaW4tcmlnaHQ6IDRweDtcXG4gIH1cXG48L3N0eWxlPlxcblxcbjwhLS0gUHVyY2hhc2VzIC0tPlxcbjxkaXYgY2xhc3M9XFxcIm1hcmtldHBsYWNlLWFic3RyYWN0XFxcIiBpZD1cXFwicHVyY2hhc2UtaGlzdG9yeVxcXCI+XFxuICA8aDIgY2xhc3M9XFxcInNlY3Rpb24tc3VidGl0bGVcXFwiPlxcbiAgICB7e3RyYW5zbGF0ZS5tYXJrZXQuYXVjdGlvbnMucHVyY2hhc2VfaGlzdG9yeX19XFxuICA8L2gyPlxcblxcbiAgPHVsIGNsYXNzPVxcXCJtYXJrZXRwbGFjZS1wdXJjaGFzZXMtaXRlbXNcXFwiPlxcbiAgICB7eyNwdXJjaGFzZXN9fVxcbiAgICA8bGlcXG4gICAgICBkYXRhLWl0ZW1pZD1cXFwie3tpdGVtaWR9fVxcXCJcXG4gICAgICBjbGFzcz1cXFwibWFya2V0cGxhY2UtYWJzdHJhY3QgbWFya2V0cGxhY2UtYXVjdGlvbnMtaXRlbSBtYXJrZXRwbGFjZS1zYWxlcy1pdGVtXFxcIlxcbiAgICA+XFxuICAgICAgPCEtLSBJY29uIC0tPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LWljb25cXFwiPlxcbiAgICAgICAgPGltZyBzcmM9XFxcInt7aWNvbn19XFxcIiAvPlxcbiAgICAgIDwvZGl2PlxcblxcbiAgICAgIDwhLS0gUHJpY2VzIC0tPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LWNvbnRhaW5lclxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1uYW1lXFxcIj57e25hbWV9fTwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtY29udGVudFxcXCI+XFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LWN1cnJlbnRQcmljZVxcXCI+XFxuICAgICAgICAgICAge3sjY3VycmVudFByaWNlfX0ge3t0cmFuc2xhdGUubWFya2V0LmF1Y3Rpb25zLmN1cnJlbnRfcHJpY2V9fVxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJwcmljZS1pdGVtXFxcIj57e2N1cnJlbnRQcmljZS5wcmljZX19PC9zcGFuPlxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYWFuYS1pY29uXFxcIj48L3NwYW4+XFxuICAgICAgICAgICAge3svY3VycmVudFByaWNlfX1cXG4gICAgICAgICAgICA8YnIgLz5cXG4gICAgICAgICAgICB7eyNidXlOb3dQcmljZX19IHt7dHJhbnNsYXRlLm1hcmtldC5hdWN0aW9ucy5idXlfbm93X3ByaWNlfX1cXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwicHJpY2UtaXRlbVxcXCI+e3tidXlOb3dQcmljZS5wcmljZX19PC9zcGFuPlxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYWFuYS1pY29uXFxcIj48L3NwYW4+XFxuICAgICAgICAgICAge3svYnV5Tm93UHJpY2V9fVxcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcblxcbiAgICAgIDwhLS0gQWN0aW9ucyAtLT5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1hY3Rpb25zXFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LXRpbWVcXFwiPnt7ZGF0ZX19PC9kaXY+XFxuICAgICAgICA8ZGl2XFxuICAgICAgICAgIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtIG1hcmtldHBsYWNlLWl0ZW1EZXRhaWwtY2FuY2VsIGRlbGV0ZS1idXR0b25cXFwiXFxuICAgICAgICAgIGRhdGEtaXRlbWlkPVxcXCJ7e2l0ZW1pZH19XFxcIlxcbiAgICAgICAgPlxcbiAgICAgICAgICB7e3RyYW5zbGF0ZS5tYXJrZXQuYXVjdGlvbnMuZGVsZXRlfX1cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2xpPlxcbiAgICB7ey9wdXJjaGFzZXN9fVxcbiAgPC91bD5cXG48L2Rpdj5cXG5cXG48IS0tIFNhbGVzIC0tPlxcbjxkaXYgY2xhc3M9XFxcIm1hcmtldHBsYWNlLWFic3RyYWN0XFxcIiBpZD1cXFwic2FsZS1oaXN0b3J5XFxcIj5cXG4gIDxoMiBjbGFzcz1cXFwic2VjdGlvbi1zdWJ0aXRsZVxcXCI+e3t0cmFuc2xhdGUubWFya2V0LmF1Y3Rpb25zLnNhbGVzX2hpc3Rvcnl9fTwvaDI+XFxuXFxuICA8dWwgY2xhc3M9XFxcIm1hcmtldHBsYWNlLXNhbGVzLWl0ZW1zXFxcIj5cXG4gICAge3sjc2FsZXN9fVxcbiAgICA8bGkgY2xhc3M9XFxcIm1hcmtldHBsYWNlLWFic3RyYWN0IG1hcmtldHBsYWNlLXNhbGVzLWl0ZW1cXFwiPlxcbiAgICAgIDwhLS0gSWNvbiAtLT5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1pY29uXFxcIj5cXG4gICAgICAgIDxpbWcgc3JjPVxcXCJ7e2ljb259fVxcXCIgLz5cXG4gICAgICA8L2Rpdj5cXG5cXG4gICAgICA8IS0tIFByaWNlcyAtLT5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1jb250YWluZXJcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtbmFtZVxcXCI+e3tuYW1lfX08L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImFic3RyYWN0LWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1jdXJyZW50UHJpY2VcXFwiPlxcbiAgICAgICAgICAgIHt7I2N1cnJlbnRQcmljZX19IHt7dHJhbnNsYXRlLm1hcmtldC5hdWN0aW9ucy5jdXJyZW50X3ByaWNlfX1cXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwicHJpY2UtaXRlbVxcXCI+e3tjdXJyZW50UHJpY2V9fTwvc3Bhbj5cXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWFhbmEtaWNvblxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgIHt7L2N1cnJlbnRQcmljZX19XFxuICAgICAgICAgICAgPGJyIC8+XFxuICAgICAgICAgICAge3sjYnV5Tm93UHJpY2V9fSB7e3RyYW5zbGF0ZS5tYXJrZXQuYXVjdGlvbnMuYnV5X25vd19wcmljZX19XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInByaWNlLWl0ZW1cXFwiPnt7YnV5Tm93UHJpY2V9fTwvc3Bhbj5cXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWFhbmEtaWNvblxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgIHt7L2J1eU5vd1ByaWNlfX1cXG4gICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICA8L2Rpdj5cXG5cXG4gICAgICA8IS0tIEFjdGlvbnMgLS0+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtYWN0aW9uc1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC10aW1lXFxcIj57e2RhdGV9fTwvZGl2PlxcbiAgICAgICAgPGRpdlxcbiAgICAgICAgICBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbSBtYXJrZXRwbGFjZS1pdGVtRGV0YWlsLWNhbmNlbCBkZWxldGUtYnV0dG9uXFxcIlxcbiAgICAgICAgPlxcbiAgICAgICAgICB7e3RyYW5zbGF0ZS5tYXJrZXQuYXVjdGlvbnMuZGVsZXRlfX1cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2xpPlxcbiAgICB7ey9zYWxlc319XFxuICA8L3VsPlxcbjwvZGl2PlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGRpdiBpZD1cXFwiZWUtb3V0Zml0LXRodW1ic1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8c3R5bGU+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LWZhdm9yaXRlcyAuc2xvdC5lZS1hdmFpbGFibGUtc2xvdCB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGh0dHBzOi8vZ2l0bGFiLmNvbS9OYXRvQm9yYW0vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLS9yYXcvbWFzdGVyL2ltYWdlcy9hdmFpbGFibGUtZmF2b3JpdGUucG5nKTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTRweCAtMTFweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBiYWNrZ3JvdW5kLXNpemU6IDE3MXB4IDI0NHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJvcmRlci1yYWRpdXM6IDQ0cHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgYm94LXNoYWRvdzogMCAwIDRweCA0cHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS1mYXZvcml0ZXMgLnNsb3QuZWUtYXZhaWxhYmxlLXNsb3Q6OmFmdGVyIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBiYWNrZ3JvdW5kOiB1cmwoL3N0YXRpYy9pbWcvbmV3LWxheW91dC93YXJkcm9iZS9pY29uLXBsdXMucG5nKTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBjb250ZW50OiBcXFwiIFxcXCI7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgZmlsdGVyOiBkcm9wLXNoYWRvdygwIDAgNnB4IHJnYmEoMjM3LCAxMiwgMjQ1LCAwLjkpKTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBoZWlnaHQ6IDcxcHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgbGVmdDogNTAlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIG9wYWNpdHk6IDA7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgcG9zaXRpb246IGFic29sdXRlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRvcDogNTAlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgZWFzZS1pbi1vdXQgMTAwbXM7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgd2lkdGg6IDY2cHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LWZhdm9yaXRlcyAuc2xvdC5lZS1hdmFpbGFibGUtc2xvdDpob3Zlcjo6YWZ0ZXIsXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LWZhdm9yaXRlcyAuc2xvdC5lZS1vdXRmaXQtdGh1bWI6aG92ZXIgcCB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgb3BhY2l0eTogMTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgI2FwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcnktZmF2b3JpdGVzIC5zbG90LmVlLW91dGZpdC10aHVtYiBpbWcge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJvcmRlci1yYWRpdXM6IDQ0cHg7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgaGVpZ2h0OiAxMDAlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHdpZHRoOiAxMDAlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS1mYXZvcml0ZXMgLnNsb3QuZWUtb3V0Zml0LXRodW1iIHAge1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBjb2xvcjogI2ZmZjtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmb250LWZhbWlseTogXFxcIkFsZWdyZXlhIFNhbnMgU0NcXFwiLCBzYW5zLXNlcmlmO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGZvbnQtc2l6ZTogMjJweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBmb250LXdlaWdodDogNzAwO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGxlZnQ6IDUwJTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBsaW5lLWhlaWdodDogMjJweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBvcGFjaXR5OiAwO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHBhZGRpbmc6IDEycHggMDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRvcDogNTAlO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgZWFzZS1pbi1vdXQgNDAwbXM7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgd2lkdGg6IDEwMCU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvc3R5bGU+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO2lmKHQucyh0LmYoXCJvdXRmaXRzXCIsYyxwLDEpLGMscCwwLDE2NTQsMTc5MCxcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiICA8ZGl2IGNsYXNzPVxcXCJzbG90IGVlLW91dGZpdC10aHVtYlxcXCIgZGF0YS1hcnJheS1pbmRleD1cXFwiXCIpO3QuYih0LnYodC5mKFwiaWRcIixjLHAsMCkpKTt0LmIoXCJcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8aW1nIGFsdD1cXFwiXCIpO3QuYih0LnYodC5mKFwibmFtZVwiLGMscCwwKSkpO3QuYihcIlxcXCIgc3JjPVxcXCJcIik7dC5iKHQudih0LmYoXCJ1cmxcIixjLHAsMCkpKTt0LmIoXCJcXFwiIC8+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxwPlwiKTt0LmIodC52KHQuZihcIm5hbWVcIixjLHAsMCkpKTt0LmIoXCI8L3A+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt9KTtjLnBvcCgpO310LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGRpdiBjbGFzcz1cXFwic2xvdCBlZS1hdmFpbGFibGUtc2xvdFxcXCI+PC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiPC9kaXY+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGRpdiBpZD1cXFwiZWUtb3V0Zml0LXRodW1ic1xcXCI+XFxuICA8c3R5bGU+XFxuICAgICNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LWZhdm9yaXRlcyAuc2xvdC5lZS1hdmFpbGFibGUtc2xvdCB7XFxuICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGh0dHBzOi8vZ2l0bGFiLmNvbS9OYXRvQm9yYW0vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLS9yYXcvbWFzdGVyL2ltYWdlcy9hdmFpbGFibGUtZmF2b3JpdGUucG5nKTtcXG4gICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTRweCAtMTFweDtcXG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IDE3MXB4IDI0NHB4O1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDQ0cHg7XFxuICAgICAgYm94LXNoYWRvdzogMCAwIDRweCA0cHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpO1xcbiAgICB9XFxuXFxuICAgICNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LWZhdm9yaXRlcyAuc2xvdC5lZS1hdmFpbGFibGUtc2xvdDo6YWZ0ZXIge1xcbiAgICAgIGJhY2tncm91bmQ6IHVybCgvc3RhdGljL2ltZy9uZXctbGF5b3V0L3dhcmRyb2JlL2ljb24tcGx1cy5wbmcpO1xcbiAgICAgIGNvbnRlbnQ6IFxcXCIgXFxcIjtcXG4gICAgICBmaWx0ZXI6IGRyb3Atc2hhZG93KDAgMCA2cHggcmdiYSgyMzcsIDEyLCAyNDUsIDAuOSkpO1xcbiAgICAgIGhlaWdodDogNzFweDtcXG4gICAgICBsZWZ0OiA1MCU7XFxuICAgICAgb3BhY2l0eTogMDtcXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgICAgdG9wOiA1MCU7XFxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxuICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSBlYXNlLWluLW91dCAxMDBtcztcXG4gICAgICB3aWR0aDogNjZweDtcXG4gICAgfVxcblxcbiAgICAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS1mYXZvcml0ZXMgLnNsb3QuZWUtYXZhaWxhYmxlLXNsb3Q6aG92ZXI6OmFmdGVyLFxcbiAgICAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS1mYXZvcml0ZXMgLnNsb3QuZWUtb3V0Zml0LXRodW1iOmhvdmVyIHAge1xcbiAgICAgIG9wYWNpdHk6IDE7XFxuICAgIH1cXG5cXG4gICAgI2FwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcnktZmF2b3JpdGVzIC5zbG90LmVlLW91dGZpdC10aHVtYiBpbWcge1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDQ0cHg7XFxuICAgICAgaGVpZ2h0OiAxMDAlO1xcbiAgICAgIHdpZHRoOiAxMDAlO1xcbiAgICB9XFxuXFxuICAgICNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LWZhdm9yaXRlcyAuc2xvdC5lZS1vdXRmaXQtdGh1bWIgcCB7XFxuICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjUpO1xcbiAgICAgIGNvbG9yOiAjZmZmO1xcbiAgICAgIGZvbnQtZmFtaWx5OiBcXFwiQWxlZ3JleWEgU2FucyBTQ1xcXCIsIHNhbnMtc2VyaWY7XFxuICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICAgICAgbGVmdDogNTAlO1xcbiAgICAgIGxpbmUtaGVpZ2h0OiAyMnB4O1xcbiAgICAgIG9wYWNpdHk6IDA7XFxuICAgICAgcGFkZGluZzogMTJweCAwO1xcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgICAgdG9wOiA1MCU7XFxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxuICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSBlYXNlLWluLW91dCA0MDBtcztcXG4gICAgICB3aWR0aDogMTAwJTtcXG4gICAgfVxcbiAgPC9zdHlsZT5cXG5cXG4gIHt7I291dGZpdHN9fVxcbiAgPGRpdiBjbGFzcz1cXFwic2xvdCBlZS1vdXRmaXQtdGh1bWJcXFwiIGRhdGEtYXJyYXktaW5kZXg9XFxcInt7aWR9fVxcXCI+XFxuICAgIDxpbWcgYWx0PVxcXCJ7e25hbWV9fVxcXCIgc3JjPVxcXCJ7e3VybH19XFxcIiAvPlxcbiAgICA8cD57e25hbWV9fTwvcD5cXG4gIDwvZGl2PlxcbiAge3svb3V0Zml0c319XFxuXFxuICA8ZGl2IGNsYXNzPVxcXCJzbG90IGVlLWF2YWlsYWJsZS1zbG90XFxcIj48L2Rpdj5cXG48L2Rpdj5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxsaSBpZD1cXFwiXCIpO3QuYih0LnYodC5mKFwiaWRcIixjLHAsMCkpKTt0LmIoXCJcXFwiIGNsYXNzPVxcXCJwcm9maWxlLWNvbnRhY3QtYWN0aW9uLWVlXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDxzcGFuIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGRpdiBjbGFzcz1cXFwiYWN0aW9uLWRlc2NyaXB0aW9uXFxcIj5cIik7dC5iKHQudih0LmYoXCJhY3Rpb25EZXNjcmlwdGlvblwiLGMscCwwKSkpO3QuYihcIjwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPC9zcGFuPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvbGk+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGxpIGlkPVxcXCJ7e2lkfX1cXFwiIGNsYXNzPVxcXCJwcm9maWxlLWNvbnRhY3QtYWN0aW9uLWVlXFxcIj5cXG4gIDxzcGFuIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYWN0aW9uLWRlc2NyaXB0aW9uXFxcIj57e2FjdGlvbkRlc2NyaXB0aW9ufX08L2Rpdj5cXG4gIDwvc3Bhbj5cXG48L2xpPlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGRpdiBjbGFzcz1cXFwiYWNjb3VudC1taXNjLWJsb2MgYWNjb3VudC1lZS1ibG9jIGJsb2NcXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPCEtLVwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPHN0eWxlPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB0YWJsZSB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgd2lkdGg6IDEwMCU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIHRoIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB0ZXh0LWFsaWduOiBzdGFydDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBwYWRkaW5nOiAxZW07XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIH1cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvc3R5bGU+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAtLT5cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8IS0tIFNldHRpbmdzIC0tPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPGgyIGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj5cIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUuYWNjb3VudC5lbmhhbmNlbWVudHNcIixjLHAsMCkpKTt0LmIoXCI8L2gyPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPHVsIGNsYXNzPVxcXCJhY2NvdW50LW1pc2MtYWN0aW9uc1xcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxsaVwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGlkPVxcXCJlZS1kZWJ1Zy1lbmFibGVkXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtIFwiKTtpZih0LnModC5mKFwiZGVidWdcIixjLHAsMSksYyxwLDAsMzkyLDM5OCxcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiYWN0aXZlXCIpO30pO2MucG9wKCk7fXQuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICB0aXRsZT1cXFwiXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLmFjY291bnQuZGVidWdfdG9vbHRpcFwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5hY2NvdW50LmRlYnVnXCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC9saT5cIik7dC5iKFwiXFxuXCIgKyBpKTtpZih0LnModC5mKFwidW5sb2NrZWRcIixjLHAsMSksYyxwLDAsNTI3LDEwMzAsXCJ7eyB9fVwiKSl7dC5ycyhjLHAsZnVuY3Rpb24oYyxwLHQpe3QuYihcIiAgICA8bGlcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBpZD1cXFwiZWUtbWluaWdhbWVzLWVuYWJsZWRcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc20gXCIpO2lmKHQucyh0LmYoXCJtaW5pZ2FtZXNcIixjLHAsMSksYyxwLDAsNjE4LDYyNCxcInt7IH19XCIpKXt0LnJzKGMscCxmdW5jdGlvbihjLHAsdCl7dC5iKFwiYWN0aXZlXCIpO30pO2MucG9wKCk7fXQuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5hY2NvdW50Lm1pbmlnYW1lc1wiLGMscCwwKSkpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDwvbGk+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxsaVwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGlkPVxcXCJlZS1leHBsb3JhdGlvbnMtZW5hYmxlZFxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbSBcIik7aWYodC5zKHQuZihcImV4cGxvcmF0aW9uc1wiLGMscCwxKSxjLHAsMCw3OTAsNzk2LFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCJhY3RpdmVcIik7fSk7Yy5wb3AoKTt9dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLmFjY291bnQuZXhwbG9yYXRpb25zXCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC9saT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPGxpXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgaWQ9XFxcImVlLW1hcmtldC1lbmFibGVkXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtIFwiKTtpZih0LnModC5mKFwibWFya2V0XCIsYyxwLDEpLGMscCwwLDk1Niw5NjIsXCJ7eyB9fVwiKSl7dC5ycyhjLHAsZnVuY3Rpb24oYyxwLHQpe3QuYihcImFjdGl2ZVwiKTt9KTtjLnBvcCgpO310LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgID5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICBcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUuYWNjb3VudC5tYXJrZXRcIixjLHAsMCkpKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICA8L2xpPlwiKTt0LmIoXCJcXG5cIiArIGkpO30pO2MucG9wKCk7fXQuYihcIiAgICA8bGkgaWQ9XFxcImVlLWltcG9ydFxcXCIgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc21cXFwiPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIFwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5hY2NvdW50LmltcG9ydFwiLGMscCwwKSkpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDwvbGk+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDxsaSBpZD1cXFwiZWUtZXhwb3J0XFxcIiBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbVxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLmFjY291bnQuZXhwb3J0XCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC9saT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvdWw+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgPCEtLSBFeHBsb3JhdGlvbnNcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDxoMyBjbGFzcz1cXFwic2VjdGlvbi10aXRsZVxcXCI+RXhwbG9yYXRpb25zPC9oMz5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDx0YWJsZT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPHRoZWFkPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDx0aD5Mb2NhdGlvbjwvdGg+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPHRoPkRlbGV0ZTwvdGg+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDwvdGhlYWQ+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDx0Ym9keT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8dGQ+Um9jazwvdGQ+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPHRkPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGRpdiBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbVxcXCI+RGVsZXRlPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPC90ZD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC90Ym9keT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvdGFibGU+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAtLT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIpO3JldHVybiB0LmZsKCk7IH0scGFydGlhbHM6IHt9LCBzdWJzOiB7ICB9fSwgXCI8ZGl2IGNsYXNzPVxcXCJhY2NvdW50LW1pc2MtYmxvYyBhY2NvdW50LWVlLWJsb2MgYmxvY1xcXCI+XFxuICA8IS0tXFxuICA8c3R5bGU+XFxuICAgIHRhYmxlIHtcXG4gICAgICB3aWR0aDogMTAwJTtcXG4gICAgfVxcblxcbiAgICB0aCB7XFxuICAgICAgdGV4dC1hbGlnbjogc3RhcnQ7XFxuICAgICAgcGFkZGluZzogMWVtO1xcbiAgICB9XFxuICA8L3N0eWxlPlxcbiAgLS0+XFxuXFxuICA8IS0tIFNldHRpbmdzIC0tPlxcbiAgPGgyIGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj57e3RyYW5zbGF0ZS5hY2NvdW50LmVuaGFuY2VtZW50c319PC9oMj5cXG4gIDx1bCBjbGFzcz1cXFwiYWNjb3VudC1taXNjLWFjdGlvbnNcXFwiPlxcbiAgICA8bGlcXG4gICAgICBpZD1cXFwiZWUtZGVidWctZW5hYmxlZFxcXCJcXG4gICAgICBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbSB7eyNkZWJ1Z319YWN0aXZle3svZGVidWd9fVxcXCJcXG4gICAgICB0aXRsZT1cXFwie3t0cmFuc2xhdGUuYWNjb3VudC5kZWJ1Z190b29sdGlwfX1cXFwiXFxuICAgID5cXG4gICAgICB7e3RyYW5zbGF0ZS5hY2NvdW50LmRlYnVnfX1cXG4gICAgPC9saT5cXG4gICAge3sjdW5sb2NrZWR9fVxcbiAgICA8bGlcXG4gICAgICBpZD1cXFwiZWUtbWluaWdhbWVzLWVuYWJsZWRcXFwiXFxuICAgICAgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc20ge3sjbWluaWdhbWVzfX1hY3RpdmV7ey9taW5pZ2FtZXN9fVxcXCJcXG4gICAgPlxcbiAgICAgIHt7dHJhbnNsYXRlLmFjY291bnQubWluaWdhbWVzfX1cXG4gICAgPC9saT5cXG4gICAgPGxpXFxuICAgICAgaWQ9XFxcImVlLWV4cGxvcmF0aW9ucy1lbmFibGVkXFxcIlxcbiAgICAgIGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtIHt7I2V4cGxvcmF0aW9uc319YWN0aXZle3svZXhwbG9yYXRpb25zfX1cXFwiXFxuICAgID5cXG4gICAgICB7e3RyYW5zbGF0ZS5hY2NvdW50LmV4cGxvcmF0aW9uc319XFxuICAgIDwvbGk+XFxuICAgIDxsaVxcbiAgICAgIGlkPVxcXCJlZS1tYXJrZXQtZW5hYmxlZFxcXCJcXG4gICAgICBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbSB7eyNtYXJrZXR9fWFjdGl2ZXt7L21hcmtldH19XFxcIlxcbiAgICA+XFxuICAgICAge3t0cmFuc2xhdGUuYWNjb3VudC5tYXJrZXR9fVxcbiAgICA8L2xpPlxcbiAgICB7ey91bmxvY2tlZH19XFxuICAgIDxsaSBpZD1cXFwiZWUtaW1wb3J0XFxcIiBjbGFzcz1cXFwibmwtYnV0dG9uIG5sLWJ1dHRvbi1zbVxcXCI+XFxuICAgICAge3t0cmFuc2xhdGUuYWNjb3VudC5pbXBvcnR9fVxcbiAgICA8L2xpPlxcbiAgICA8bGkgaWQ9XFxcImVlLWV4cG9ydFxcXCIgY2xhc3M9XFxcIm5sLWJ1dHRvbiBubC1idXR0b24tc21cXFwiPlxcbiAgICAgIHt7dHJhbnNsYXRlLmFjY291bnQuZXhwb3J0fX1cXG4gICAgPC9saT5cXG4gIDwvdWw+XFxuXFxuICA8IS0tIEV4cGxvcmF0aW9uc1xcbiAgPGgzIGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj5FeHBsb3JhdGlvbnM8L2gzPlxcbiAgPHRhYmxlPlxcbiAgICA8dGhlYWQ+XFxuICAgICAgPHRoPkxvY2F0aW9uPC90aD5cXG4gICAgICA8dGg+RGVsZXRlPC90aD5cXG4gICAgPC90aGVhZD5cXG4gICAgPHRib2R5PlxcbiAgICAgIDx0ZD5Sb2NrPC90ZD5cXG4gICAgICA8dGQ+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJubC1idXR0b24gbmwtYnV0dG9uLXNtXFxcIj5EZWxldGU8L2Rpdj5cXG4gICAgICA8L3RkPlxcbiAgICA8L3Rib2R5PlxcbiAgPC90YWJsZT5cXG4gIC0tPlxcbjwvZGl2PlxcblwiLCBIKTtyZXR1cm4gVDsgfSgpOyIsInZhciBIID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdmFyIFQgPSBuZXcgSC5UZW1wbGF0ZSh7Y29kZTogZnVuY3Rpb24gKGMscCxpKSB7IHZhciB0PXRoaXM7dC5iKGk9aXx8XCJcIik7dC5iKFwiPGEgaWQ9XFxcIndpc2hsaXN0LWJ1dHRvblxcXCIgY2xhc3M9XFxcIm5sLWJ1dHRvblxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICBcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LnRpdGxlXCIsYyxwLDApKSk7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L2E+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPGEgaWQ9XFxcIndpc2hsaXN0LWJ1dHRvblxcXCIgY2xhc3M9XFxcIm5sLWJ1dHRvblxcXCI+XFxuICB7e3RyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QudGl0bGV9fVxcbjwvYT5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJ2YXIgSCA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHZhciBUID0gbmV3IEguVGVtcGxhdGUoe2NvZGU6IGZ1bmN0aW9uIChjLHAsaSkgeyB2YXIgdD10aGlzO3QuYihpPWl8fFwiXCIpO3QuYihcIjxzdHlsZT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIHRhYmxlIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgdGV4dC1hbGlnbjogY2VudGVyO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB3aWR0aDogMTAwJTtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIH1cIik7dC5iKFwiXFxuXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAuYWN0aW9uLXBpY3RvIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgaGVpZ2h0OiA1MHB4O1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICB3aWR0aDogNTBweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgY3Vyc29yOiBwb2ludGVyO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIC5hY3Rpb24tcGljdG86aG92ZXI6bm90KC5kaXNhYmxlZCksXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAuZWRpdC1wcmljZTpob3ZlciB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGFuaW1hdGlvbjogYnV0dG9uLWJvdW5jZSAzMDBtcyBsaW5lYXIgZm9yd2FyZHM7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGZpbHRlcjogYnJpZ2h0bmVzcygxLjA1KSBjb250cmFzdCgxLjEpO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIC5lZGl0LXByaWNlIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgY3Vyc29yOiBwb2ludGVyO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIGltZy5kaXNhYmxlZCB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIGZpbHRlcjogZ3JheXNjYWxlKDEpO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgfVwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIC5pdGVtLWljb24tY29udGFpbmVyIHtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICB9XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgLml0ZW0taWNvbiB7XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIHdpZHRoOiAxMDBweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgaGVpZ2h0OiAxMDBweDtcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIH1cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8L3N0eWxlPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCI8dGFibGU+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8dGhlYWQ+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDx0cj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8dGg+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5pY29uXCIsYyxwLDApKSk7dC5iKFwiPC90aD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8dGg+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5uYW1lXCIsYyxwLDApKSk7dC5iKFwiPC90aD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8dGg+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5wcmljZVwiLGMscCwwKSkpO3QuYihcIjwvdGg+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPHRoPlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3Quc3RhdHVzXCIsYyxwLDApKSk7dC5iKFwiPC90aD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8dGg+XCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5hY3Rpb25zXCIsYyxwLDApKSk7dC5iKFwiPC90aD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgPC90cj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgIDwvdGhlYWQ+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICA8dGJvZHk+XCIpO3QuYihcIlxcblwiICsgaSk7aWYodC5zKHQuZihcIndpc2hsaXN0XCIsYyxwLDEpLGMscCwwLDg3MiwyMjYwLFwie3sgfX1cIikpe3QucnMoYyxwLGZ1bmN0aW9uKGMscCx0KXt0LmIoXCIgICAgPHRyIGNsYXNzPVxcXCJtYXJrZXRwbGFjZS1hYnN0cmFjdFxcXCIgZGF0YS1pY29uPVxcXCJcIik7dC5iKHQudih0LmYoXCJpY29uXCIsYyxwLDApKSk7dC5iKFwiXFxcIj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8IS0tIEljb24gLS0+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPHRkPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGRpdiBjbGFzcz1cXFwiaXRlbS1pY29uLWNvbnRhaW5lclxcXCI+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIDxpbWcgY2xhc3M9XFxcIml0ZW0taWNvblxcXCIgc3JjPVxcXCJcIik7dC5iKHQudih0LmYoXCJpY29uXCIsYyxwLDApKSk7dC5iKFwiXFxcIiBhbHQ9XFxcIlwiKTt0LmIodC52KHQuZihcIm5hbWVcIixjLHAsMCkpKTt0LmIoXCJcXFwiIC8+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInJhcml0eS1tYXJrZXItXCIpO3QuYih0LnYodC5mKFwicmFyaXR5XCIsYyxwLDApKSk7dC5iKFwiXFxcIj48L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwvdGQ+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwhLS0gTmFtZSAtLT5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8dGQ+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1uYW1lXFxcIj5cIik7dC5iKHQudih0LmYoXCJuYW1lXCIsYyxwLDApKSk7dC5iKFwiPC9kaXY+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC10eXBlXFxcIj5cIik7dC5iKHQudih0LmYoXCJhYnN0cmFjdFR5cGVcIixjLHAsMCkpKTt0LmIoXCI8L2Rpdj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8L3RkPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8IS0tIFByaWNlIC0tPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDx0ZD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDxkaXZcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgY2xhc3M9XFxcImVkaXQtcHJpY2VcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIHRpdGxlPVxcXCJcIik7dC5iKHQudih0LmQoXCJ0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LmNoYW5nZV9wcmljZVwiLGMscCwwKSkpO3QuYihcIlxcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgID5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInByaWNlLWl0ZW1cXFwiPlwiKTt0LmIodC52KHQuZihcInByaWNlXCIsYyxwLDApKSk7dC5iKFwiPC9zcGFuPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWFhbmEtaWNvblxcXCIgYWx0PVxcXCJtYWFuYXNcXFwiPjwvc3Bhbj5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgIDwvZGl2PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwvdGQ+XCIpO3QuYihcIlxcblwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwhLS0gRXJyb3IgLS0+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPHRkPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPHAgY2xhc3M9XFxcImVycm9yXFxcIj5cIik7dC5iKHQudih0LmYoXCJlcnJvclwiLGMscCwwKSkpO3QuYihcIjwvcD5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8L3RkPlwiKTt0LmIoXCJcXG5cIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICA8IS0tIEFjdGlvbnMgLS0+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgPHRkPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGltZ1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICBjbGFzcz1cXFwiYWN0aW9uLXBpY3RvIHJlc2V0LWl0ZW0tc3RhdHVzIFwiKTtpZighdC5zKHQuZihcImVycm9yXCIsYyxwLDEpLGMscCwxLDAsMCxcIlwiKSl7dC5iKFwiZGlzYWJsZWRcIik7fTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIHNyYz1cXFwiL3N0YXRpYy9pbWcvbmV3LWxheW91dC93YXJkcm9iZS9yZXNldC1idG4ucG5nXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICB0aXRsZT1cXFwiXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5yZXNldF90b29sdGlwXCIsYyxwLDApKSk7dC5iKFwiXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICBhbHQ9XFxcIlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QucmVzZXRcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAvPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgPGltZ1wiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICBjbGFzcz1cXFwiYWN0aW9uLXBpY3RvIGRlbGV0ZS13aXNobGlzdC1pdGVtXFxcIlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgICAgICBzcmM9XFxcIi9zdGF0aWMvaW1nL25ldy1sYXlvdXQvd2FyZHJvYmUvZGVsZXRlLnBuZ1xcXCJcIik7dC5iKFwiXFxuXCIgKyBpKTt0LmIoXCIgICAgICAgICAgdGl0bGU9XFxcIlwiKTt0LmIodC52KHQuZChcInRyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QuZGVsZXRlX3Rvb2x0aXBcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAgIGFsdD1cXFwiXCIpO3QuYih0LnYodC5kKFwidHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5kZWxldGVcIixjLHAsMCkpKTt0LmIoXCJcXFwiXCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgICAgICAvPlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIiAgICAgIDwvdGQ+XCIpO3QuYihcIlxcblwiICsgaSk7dC5iKFwiICAgIDwvdHI+XCIpO3QuYihcIlxcblwiICsgaSk7fSk7Yy5wb3AoKTt9dC5iKFwiICA8L3Rib2R5PlwiKTt0LmIoXCJcXG5cIiArIGkpO3QuYihcIjwvdGFibGU+XCIpO3QuYihcIlxcblwiKTtyZXR1cm4gdC5mbCgpOyB9LHBhcnRpYWxzOiB7fSwgc3ViczogeyAgfX0sIFwiPHN0eWxlPlxcbiAgdGFibGUge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgfVxcblxcbiAgLmFjdGlvbi1waWN0byB7XFxuICAgIGhlaWdodDogNTBweDtcXG4gICAgd2lkdGg6IDUwcHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gIH1cXG5cXG4gIC5hY3Rpb24tcGljdG86aG92ZXI6bm90KC5kaXNhYmxlZCksXFxuICAuZWRpdC1wcmljZTpob3ZlciB7XFxuICAgIGFuaW1hdGlvbjogYnV0dG9uLWJvdW5jZSAzMDBtcyBsaW5lYXIgZm9yd2FyZHM7XFxuICAgIGZpbHRlcjogYnJpZ2h0bmVzcygxLjA1KSBjb250cmFzdCgxLjEpO1xcbiAgfVxcblxcbiAgLmVkaXQtcHJpY2Uge1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICB9XFxuXFxuICBpbWcuZGlzYWJsZWQge1xcbiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgxKTtcXG4gIH1cXG5cXG4gIC5pdGVtLWljb24tY29udGFpbmVyIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB9XFxuXFxuICAuaXRlbS1pY29uIHtcXG4gICAgd2lkdGg6IDEwMHB4O1xcbiAgICBoZWlnaHQ6IDEwMHB4O1xcbiAgfVxcbjwvc3R5bGU+XFxuXFxuPHRhYmxlPlxcbiAgPHRoZWFkPlxcbiAgICA8dHI+XFxuICAgICAgPHRoPnt7dHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5pY29ufX08L3RoPlxcbiAgICAgIDx0aD57e3RyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QubmFtZX19PC90aD5cXG4gICAgICA8dGg+e3t0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LnByaWNlfX08L3RoPlxcbiAgICAgIDx0aD57e3RyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3Quc3RhdHVzfX08L3RoPlxcbiAgICAgIDx0aD57e3RyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QuYWN0aW9uc319PC90aD5cXG4gICAgPC90cj5cXG4gIDwvdGhlYWQ+XFxuICA8dGJvZHk+XFxuICAgIHt7I3dpc2hsaXN0fX1cXG4gICAgPHRyIGNsYXNzPVxcXCJtYXJrZXRwbGFjZS1hYnN0cmFjdFxcXCIgZGF0YS1pY29uPVxcXCJ7e2ljb259fVxcXCI+XFxuICAgICAgPCEtLSBJY29uIC0tPlxcbiAgICAgIDx0ZD5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIml0ZW0taWNvbi1jb250YWluZXJcXFwiPlxcbiAgICAgICAgICA8aW1nIGNsYXNzPVxcXCJpdGVtLWljb25cXFwiIHNyYz1cXFwie3tpY29ufX1cXFwiIGFsdD1cXFwie3tuYW1lfX1cXFwiIC8+XFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInJhcml0eS1tYXJrZXIte3tyYXJpdHl9fVxcXCI+PC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICA8L3RkPlxcblxcbiAgICAgIDwhLS0gTmFtZSAtLT5cXG4gICAgICA8dGQ+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhYnN0cmFjdC1uYW1lXFxcIj57e25hbWV9fTwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWJzdHJhY3QtdHlwZVxcXCI+e3thYnN0cmFjdFR5cGV9fTwvZGl2PlxcbiAgICAgIDwvdGQ+XFxuXFxuICAgICAgPCEtLSBQcmljZSAtLT5cXG4gICAgICA8dGQ+XFxuICAgICAgICA8ZGl2XFxuICAgICAgICAgIGNsYXNzPVxcXCJlZGl0LXByaWNlXFxcIlxcbiAgICAgICAgICB0aXRsZT1cXFwie3t0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LmNoYW5nZV9wcmljZX19XFxcIlxcbiAgICAgICAgPlxcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwicHJpY2UtaXRlbVxcXCI+e3twcmljZX19PC9zcGFuPlxcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWFhbmEtaWNvblxcXCIgYWx0PVxcXCJtYWFuYXNcXFwiPjwvc3Bhbj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvdGQ+XFxuXFxuICAgICAgPCEtLSBFcnJvciAtLT5cXG4gICAgICA8dGQ+XFxuICAgICAgICA8cCBjbGFzcz1cXFwiZXJyb3JcXFwiPnt7ZXJyb3J9fTwvcD5cXG4gICAgICA8L3RkPlxcblxcbiAgICAgIDwhLS0gQWN0aW9ucyAtLT5cXG4gICAgICA8dGQ+XFxuICAgICAgICA8aW1nXFxuICAgICAgICAgIGNsYXNzPVxcXCJhY3Rpb24tcGljdG8gcmVzZXQtaXRlbS1zdGF0dXMge3teZXJyb3J9fWRpc2FibGVke3svZXJyb3J9fVxcXCJcXG4gICAgICAgICAgc3JjPVxcXCIvc3RhdGljL2ltZy9uZXctbGF5b3V0L3dhcmRyb2JlL3Jlc2V0LWJ0bi5wbmdcXFwiXFxuICAgICAgICAgIHRpdGxlPVxcXCJ7e3RyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QucmVzZXRfdG9vbHRpcH19XFxcIlxcbiAgICAgICAgICBhbHQ9XFxcInt7dHJhbnNsYXRlLm1hcmtldC53aXNobGlzdC5yZXNldH19XFxcIlxcbiAgICAgICAgLz5cXG4gICAgICAgIDxpbWdcXG4gICAgICAgICAgY2xhc3M9XFxcImFjdGlvbi1waWN0byBkZWxldGUtd2lzaGxpc3QtaXRlbVxcXCJcXG4gICAgICAgICAgc3JjPVxcXCIvc3RhdGljL2ltZy9uZXctbGF5b3V0L3dhcmRyb2JlL2RlbGV0ZS5wbmdcXFwiXFxuICAgICAgICAgIHRpdGxlPVxcXCJ7e3RyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QuZGVsZXRlX3Rvb2x0aXB9fVxcXCJcXG4gICAgICAgICAgYWx0PVxcXCJ7e3RyYW5zbGF0ZS5tYXJrZXQud2lzaGxpc3QuZGVsZXRlfX1cXFwiXFxuICAgICAgICAvPlxcbiAgICAgIDwvdGQ+XFxuICAgIDwvdHI+XFxuICAgIHt7L3dpc2hsaXN0fX1cXG4gIDwvdGJvZHk+XFxuPC90YWJsZT5cXG5cIiwgSCk7cmV0dXJuIFQ7IH0oKTsiLCJpbXBvcnQgeyBCb2R5TG9jYXRpb24gfSBmcm9tIFwiLi4vbWFya2V0cGxhY2UvZW51bXMvYm9keV9sb2NhdGlvbi5lbnVtXCJcbmltcG9ydCB7IENhdGVnb3J5TnVtYmVyIH0gZnJvbSBcIi4uL21hcmtldHBsYWNlL2VudW1zL2NhdGVnb3J5LmVudW1cIlxuaW1wb3J0IHsgR3VhcmQgfSBmcm9tIFwiLi4vbWFya2V0cGxhY2UvZW51bXMvZ3VhcmQuZW51bVwiXG5pbXBvcnQgeyBSYXJpdHkgfSBmcm9tIFwiLi4vbWFya2V0cGxhY2UvZW51bXMvcmFyaXR5LmVudW1cIlxuaW1wb3J0IHsgVHlwZSB9IGZyb20gXCIuLi9tYXJrZXRwbGFjZS9lbnVtcy90eXBlLmVudW1cIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWpheFNlYXJjaChkYXRhOiB7XG4gIHR5cGU/OiBUeXBlXG4gIGJvZHlMb2NhdGlvbj86IEJvZHlMb2NhdGlvblxuICBjYXRlZ29yeT86IENhdGVnb3J5TnVtYmVyXG4gIHJhcml0eT86IFJhcml0eVxuICBwcmljZT86IG51bWJlciB8IFwiXCJcbiAgZ3VhcmQ/OiBHdWFyZFxuICAvKiogUGFnZSBudW1iZXIsIGluZGV4ZWQgYnkgMSAqL1xuICBwYWdlOiBudW1iZXJcbiAgbmFtZT86IHN0cmluZ1xufSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGRhdGEgPSB7XG4gICAgLi4ue1xuICAgICAgdHlwZTogVHlwZS5BbGwsXG4gICAgICBib2R5TG9jYXRpb246IEJvZHlMb2NhdGlvbi5BbGwsXG4gICAgICBjYXRlZ29yeTogQ2F0ZWdvcnlOdW1iZXIuYWxsLFxuICAgICAgcmFyaXR5OiBSYXJpdHkuYWxsLFxuICAgICAgcHJpY2U6IFwiXCIsXG4gICAgICBndWFyZDogR3VhcmQuYW55LFxuICAgICAgcGFnZTogMSxcbiAgICAgIG5hbWU6IFwiXCIsXG4gICAgfSxcbiAgICAuLi5kYXRhLFxuICB9XG5cbiAgY29uc3QgSVRFTVNfUEVSX1BBR0UgPSA4XG4gIHJldHVybiAoYXdhaXQgJC5nZXQoXCIvbWFya2V0cGxhY2UvYWpheF9zZWFyY2hcIiwge1xuICAgIC4uLmRhdGEsXG4gICAgZnJvbTogKGRhdGEucGFnZSAtIDEpICogSVRFTVNfUEVSX1BBR0UsXG4gICAgdG86IElURU1TX1BFUl9QQUdFLFxuICB9KSkgYXMgc3RyaW5nXG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2tldCB9IGZyb20gXCIuLi9hcGkvcGFja2V0XCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnV5KGl0ZW1JZDogbnVtYmVyKTogUHJvbWlzZTxQYWNrZXQ8XCJcIj4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIHZvaWQgJC5wb3N0KFxuICAgICAgXCIvbWFya2V0cGxhY2UvYnV5XCIsXG4gICAgICB7IGlkOiBpdGVtSWQgfSxcbiAgICAgIChqc29uOiBQYWNrZXQ8XCJcIj4pOiB2b2lkID0+IHtcbiAgICAgICAgTG9jYWxTdG9yYWdlLm1ldGEgPSBqc29uLm1ldGFcbiAgICAgICAgcmVzb2x2ZShqc29uKVxuXG4gICAgICAgIGlmIChqc29uLnJlc3VsdCAhPT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAkLmZsYXZyTm90aWYoanNvbi5kYXRhKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJqc29uXCJcbiAgICApXG4gIH0pXG59XG4iLCJpbXBvcnQgdHlwZSB7IEV4cGxvcmF0aW9uUmVzdWx0c0RhdGEgfSBmcm9tIFwiLi4vYXBpL2V4cGxvcmF0aW9uX3Jlc3VsdHNfZGF0YVwiXG5pbXBvcnQgdHlwZSB7IFBhY2tldCB9IGZyb20gXCIuLi9hcGkvcGFja2V0XCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FwdHVyZUVuZCgpOiBQcm9taXNlPFBhY2tldDxFeHBsb3JhdGlvblJlc3VsdHNEYXRhPj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgdm9pZCAkLnBvc3QoXG4gICAgICBcIi9wZXQvY2FwdHVyZS9lbmRcIixcbiAgICAgIChqc29uOiBQYWNrZXQ8RXhwbG9yYXRpb25SZXN1bHRzRGF0YT4pOiB2b2lkID0+IHtcbiAgICAgICAgTG9jYWxTdG9yYWdlLm1ldGEgPSBqc29uLm1ldGFcbiAgICAgICAgcmVzb2x2ZShqc29uKVxuXG4gICAgICAgIGlmIChqc29uLnJlc3VsdCAhPT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAkLmZsYXZyTm90aWYoanNvbi5kYXRhKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuICB9KVxufVxuIiwiaW1wb3J0IHR5cGUgeyBDaGFuZ2VSZWdpb25EYXRhIH0gZnJvbSBcIi4uL2FwaS9jaGFuZ2VfcmVnaW9uX2RhdGFcIlxuaW1wb3J0IHR5cGUgeyBQYWNrZXQgfSBmcm9tIFwiLi4vYXBpL3BhY2tldFwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoYW5nZVJlZ2lvbihcbiAgbmV3UmVnaW9uSWQ6IG51bWJlclxuKTogUHJvbWlzZTxQYWNrZXQ8Q2hhbmdlUmVnaW9uRGF0YT4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFBhY2tldDxDaGFuZ2VSZWdpb25EYXRhPj4oKHJlc29sdmUpOiB2b2lkID0+IHtcbiAgICB2b2lkICQucG9zdChcbiAgICAgIFwiL3BldC9jaGFuZ2VSZWdpb25cIixcbiAgICAgIHsgbmV3UmVnaW9uSWQgfSxcbiAgICAgIChqc29uOiBQYWNrZXQ8Q2hhbmdlUmVnaW9uRGF0YT4pOiB2b2lkID0+IHtcbiAgICAgICAgTG9jYWxTdG9yYWdlLm1ldGEgPSBqc29uLm1ldGFcbiAgICAgICAgcmVzb2x2ZShqc29uKVxuXG4gICAgICAgIGlmIChqc29uLnJlc3VsdCAhPT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAkLmZsYXZyTm90aWYoanNvbi5kYXRhKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFJlZ2lvbiA9IGpzb24uZGF0YS5jdXJyZW50UmVnaW9uXG5cbiAgICAgICAgcGVuZGluZ1RyZWFzdXJlSHVudExvY2F0aW9uID1cbiAgICAgICAgICB0eXBlb2YganNvbi5kYXRhLnBlbmRpbmdUcmVhc3VyZUh1bnRMb2NhdGlvbiA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IGpzb24uZGF0YS5wZW5kaW5nVHJlYXN1cmVIdW50TG9jYXRpb25cblxuICAgICAgICB0aW1lTGVmdEV4cGxvcmF0aW9uID1cbiAgICAgICAgICB0eXBlb2YganNvbi5kYXRhLnRpbWVMZWZ0RXhwbG9yYXRpb24gPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiBqc29uLmRhdGEudGltZUxlZnRFeHBsb3JhdGlvblxuICAgICAgfVxuICAgIClcbiAgfSlcbn1cbiIsImltcG9ydCB0eXBlIHsgRXhwbG9yYXRpb25SZXN1bHRzRGF0YSB9IGZyb20gXCIuLi9hcGkvZXhwbG9yYXRpb25fcmVzdWx0c19kYXRhXCJcbmltcG9ydCB0eXBlIHsgUGFja2V0IH0gZnJvbSBcIi4uL2FwaS9wYWNrZXRcIlxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlIH0gZnJvbSBcIi4uL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBsb3JhdGlvblJlc3VsdHMoKTogUHJvbWlzZTxcbiAgUGFja2V0PEV4cGxvcmF0aW9uUmVzdWx0c0RhdGE+XG4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFBhY2tldDxFeHBsb3JhdGlvblJlc3VsdHNEYXRhPj4oKHJlc29sdmUpOiB2b2lkID0+IHtcbiAgICB2b2lkICQucG9zdChcbiAgICAgIFwiL3BldC9leHBsb3JhdGlvblJlc3VsdHNcIixcbiAgICAgIChqc29uOiBQYWNrZXQ8RXhwbG9yYXRpb25SZXN1bHRzRGF0YT4pOiB2b2lkID0+IHtcbiAgICAgICAgTG9jYWxTdG9yYWdlLm1ldGEgPSBqc29uLm1ldGFcbiAgICAgICAgcmVzb2x2ZShqc29uKVxuXG4gICAgICAgIGlmIChqc29uLnJlc3VsdCAhPT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAkLmZsYXZyTm90aWYoanNvbi5kYXRhKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuICB9KVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBNZXRhIHtcbiAgZXZlbnQ6IE1ldGFFdmVudFxuICBtZXNzYWdlOiBNZXNzYWdlXG4gIG5vdGlmaWNhdGlvbnM6IE5vdGlmaWNhdGlvbnNcbiAgcGV0OiBQZXRcbiAgcGxheWVyOiBQbGF5ZXJcbiAgcHVycm9zaG9wOiBQdXJyb3Nob3Bcbn1cblxudHlwZSBNZXRhRXZlbnQgPSBcImVhc3RlclwiIHwgbnVsbFxuXG5pbnRlcmZhY2UgTWVzc2FnZSB7XG4gIHVucmVhZDogc3RyaW5nXG59XG5cbmludGVyZmFjZSBQZXQge1xuICAvKiogRXhwbG9yYXRpb24gaXMgZmluaXNoZWQgKi9cbiAgZXhwbG9yYXRpb246IGJvb2xlYW5cbiAgcG9ydHJhaXQ6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgUGxheWVyIHtcbiAgZGFpbHlNYWFuYTogYm9vbGVhblxuICBnb2xkOiBDdXJyZW5jeVxuICBsZWdhY3lDdXJyZW5jeTogQ3VycmVuY3lcbiAgbWFhbmE6IEN1cnJlbmN5XG4gIHB1cnJvcGFzczogUHVycm9wYXNzXG4gIHVucmVhZE5ld3M6IG51bGxcbiAgeHA6IFhQXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VycmVuY3kge1xuICBjaGFuZ2U6IENoYW5nZVxuICB0ZXh0OiBzdHJpbmdcbiAgdmFsdWU6IG51bWJlclxufVxuXG5pbnRlcmZhY2UgQ2hhbmdlIHtcbiAgdGV4dDogc3RyaW5nXG4gIHZhbHVlOiBudW1iZXJcbn1cblxuaW50ZXJmYWNlIFB1cnJvcGFzcyB7XG4gIGNoYW5nZTogQ2hhbmdlXG4gIHRleHQ6IHN0cmluZ1xuICB2YWx1ZTogc3RyaW5nXG59XG5cbmludGVyZmFjZSBYUCB7XG4gIGdvYWw6IG51bWJlclxuICBsZXZlbDogbnVtYmVyXG4gIHZhbHVlOiBudW1iZXJcbn1cblxuaW50ZXJmYWNlIFB1cnJvc2hvcCB7XG4gIHN0YXR1czogUHVycm9zaG9wU3RhdHVzXG59XG5cbmludGVyZmFjZSBOb3RpZmljYXRpb25zIHtcbiAgZGlzcGxheVRpbWU6IG51bWJlclxuICBtZXNzYWdlOiBzdHJpbmdcbiAgdHlwZTogc3RyaW5nXG59XG5cbmV4cG9ydCBlbnVtIFB1cnJvc2hvcFN0YXR1cyB7XG4gIGRpc2FibGVkID0gXCJkaXNhYmxlZFwiLFxuICBlbmFibGVkID0gXCJlbmFibGVkXCIsXG59XG4iLCJleHBvcnQgZW51bSBSZXN1bHQge1xuICBlcnJvciA9IFwiZXJyb3JcIixcbiAgc3VjY2VzcyA9IFwic3VjY2Vzc1wiLFxufVxuIiwiaW1wb3J0IHdhcmRyb2JlIGZyb20gXCIuL3dhcmRyb2JlXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRBcHBlYXJhbmNlVUkoKTogdm9pZCB7XG4gIHNldHVwQmFja2dyb3VuZCgpXG4gIHNldHVwTGVmdFBhbmVsKClcbiAgc2V0dXBSaWdodFBhbmVsKClcblxuICBpZiAod2FyZHJvYmUuYXZhaWxhYmxlSXRlbXMpIGF2YWlsYWJsZUl0ZW1zID0gd2FyZHJvYmUuYXZhaWxhYmxlSXRlbXNcbiAgZWxzZSB3YXJkcm9iZS5hdmFpbGFibGVJdGVtcyA9IGF2YWlsYWJsZUl0ZW1zXG59XG5cbmZ1bmN0aW9uIHNldHVwQmFja2dyb3VuZCgpOiB2b2lkIHtcbiAgY29uc3QgYmFja2dyb3VuZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEltYWdlRWxlbWVudD4oXG4gICAgXCIjYXZhdGFyLWJhY2tncm91bmQgaW1nXCJcbiAgKVxuICBpZiAoYmFja2dyb3VuZCkge1xuICAgIGJhY2tncm91bmQuc3R5bGUuZmlsdGVyID0gXCJ1bnNldFwiXG4gICAgYmFja2dyb3VuZC5zdHlsZS5oZWlnaHQgPSBcInVuc2V0XCJcbiAgICBiYWNrZ3JvdW5kLnN0eWxlLm1hc2sgPVxuICAgICAgXCJsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIGJsYWNrIDUwJSwgdHJhbnNwYXJlbnQgMTAwJSlcIlxuICAgIGJhY2tncm91bmQuc3R5bGUubWluSGVpZ2h0ID0gXCIxMDB2aFwiXG4gICAgYmFja2dyb3VuZC5zdHlsZS5taW5XaWR0aCA9IFwiNTB2d1wiXG4gICAgYmFja2dyb3VuZC5zdHlsZS5wb3NpdGlvbiA9IFwiZml4ZWRcIlxuICAgIGJhY2tncm91bmQuc3R5bGUudHJhbnNmb3JtID0gXCJ1bnNldFwiXG4gICAgYmFja2dyb3VuZC5zdHlsZS53aWR0aCA9IFwidW5zZXRcIlxuICB9XG59XG5cbmZ1bmN0aW9uIHNldHVwUmlnaHRQYW5lbCgpOiB2b2lkIHtcbiAgY29uc3QgcmlnaHRQYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYXBwZWFyYW5jZS1yaWdodFwiKVxuICBpZiAocmlnaHRQYW5lbCkgcmlnaHRQYW5lbC5zdHlsZS5wYWRkaW5nVG9wID0gXCI4MHB4XCJcbn1cblxuZnVuY3Rpb24gc2V0dXBMZWZ0UGFuZWwoKTogdm9pZCB7XG4gIGNvbnN0IHByZXZpZXdPdXRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYXBwZWFyYW5jZS1wcmV2aWV3LW91dGVyXCIpXG4gIGlmIChwcmV2aWV3T3V0ZXIpIHtcbiAgICBwcmV2aWV3T3V0ZXIuc3R5bGUucGFkZGluZyA9IFwiMHB4XCJcbiAgfVxuXG4gIGNvbnN0IHByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFwcGVhcmFuY2UtcHJldmlld1wiKVxuICBpZiAocHJldmlldykge1xuICAgIHByZXZpZXcuc3R5bGUubGVmdCA9IFwiMFwiXG4gICAgcHJldmlldy5zdHlsZS5wb3NpdGlvbiA9IFwiZml4ZWRcIlxuICAgIHByZXZpZXcuc3R5bGUudG9wID0gXCJjYWxjKDUwJSAtIHZhcigtLXRvcGJhci1oZWlnaHQpKVwiXG4gICAgcHJldmlldy5zdHlsZS50cmFuc2Zvcm0gPSBcInRyYW5zbGF0ZVkoLTUwJSlcIlxuICB9XG5cbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQ2FudmFzRWxlbWVudD4oXG4gICAgXCIjYXBwZWFyYW5jZS1wcmV2aWV3IGNhbnZhc1wiXG4gIClcbiAgaWYgKGNhbnZhcykge1xuICAgIGNhbnZhcy5zdHlsZS5tYXhIZWlnaHQgPSBcIjEwMHZoXCJcbiAgICBjYW52YXMuc3R5bGUubWF4V2lkdGggPSBcIjUwdndcIlxuICB9XG59XG4iLCJpbXBvcnQgeyB0cmltSWNvbiB9IGZyb20gXCIuLi9lbGRhcnlhX3V0aWxcIlxuaW1wb3J0IHR5cGUgeyBBcHBlYXJhbmNlQ2F0ZWdvcnkgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvYXBwZWFyYW5jZV9jYXRlZ29yeVwiXG5pbXBvcnQgdHlwZSB7IEFwcGVhcmFuY2VHcm91cCB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9hcHBlYXJhbmNlX2dyb3VwXCJcbmltcG9ydCB0eXBlIHsgQXBwZWFyYW5jZUl0ZW0gfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvYXBwZWFyYW5jZV9pdGVtXCJcbmltcG9ydCB0eXBlIHsgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZSB9IGZyb20gXCIuL2VudW1zL2FwcGVhcmFuY2VfY2F0ZWdvcnlfY29kZS5lbnVtXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3J5Q29udGFpbmVyRGF0YVNldChcbiAgY2F0ZWdvcnlDb250YWluZXI6IEhUTUxEaXZFbGVtZW50XG4pOiBBcHBlYXJhbmNlQ2F0ZWdvcnkgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGNhdGVnb3J5aWQsIGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUgfSA9IGNhdGVnb3J5Q29udGFpbmVyLmRhdGFzZXRcbiAgaWYgKCFjYXRlZ29yeWlkIHx8ICFjYXRlZ29yeSB8fCAhY2F0ZWdvcnluYW1lKSByZXR1cm5cbiAgcmV0dXJuIHtcbiAgICBjYXRlZ29yeWlkOiBOdW1iZXIoY2F0ZWdvcnlpZCksXG4gICAgY2F0ZWdvcnk6IGNhdGVnb3J5IGFzIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUsXG4gICAgY2F0ZWdvcnluYW1lLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yeUdyb3VwRGF0YVNldChcbiAgZ3JvdXBJdGVtOiBIVE1MTElFbGVtZW50LFxuICBhcHBlYXJhbmNlQ2F0ZWdvcnk6IEFwcGVhcmFuY2VDYXRlZ29yeVxuKTogQXBwZWFyYW5jZUdyb3VwIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBpdGVtaWQsIGdyb3VwLCBuYW1lLCByYXJpdHksIHJhcml0eW5hbWUgfSA9IGdyb3VwSXRlbS5kYXRhc2V0XG4gIGlmICghaXRlbWlkIHx8ICFncm91cCB8fCAhbmFtZSB8fCAhcmFyaXR5IHx8ICFyYXJpdHluYW1lKSByZXR1cm5cbiAgcmV0dXJuIHtcbiAgICAuLi5hcHBlYXJhbmNlQ2F0ZWdvcnksXG4gICAgaXRlbWlkOiBOdW1iZXIoaXRlbWlkKSxcbiAgICBncm91cDogTnVtYmVyKGdyb3VwKSxcbiAgICBuYW1lLFxuICAgIHJhcml0eSxcbiAgICByYXJpdHluYW1lLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpdGVtRGF0YVNldChcbiAgbGk6IEhUTUxMSUVsZW1lbnQsXG4gIGFwcGVhcmFuY2VHcm91cDogQXBwZWFyYW5jZUdyb3VwXG4pOiBBcHBlYXJhbmNlSXRlbSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgaXRlbWlkLCBuYW1lLCByYXJpdHksIHJhcml0eW5hbWUgfSA9IGxpLmRhdGFzZXRcbiAgY29uc3QgaWNvbiA9IGxpLnF1ZXJ5U2VsZWN0b3IoXCJpbWdcIik/LnNyY1xuICBpZiAoIWl0ZW1pZCB8fCAhbmFtZSB8fCAhcmFyaXR5IHx8ICFyYXJpdHluYW1lIHx8ICFpY29uKSByZXR1cm5cblxuICByZXR1cm4ge1xuICAgIC4uLmFwcGVhcmFuY2VHcm91cCxcbiAgICBpdGVtaWQ6IE51bWJlcihpdGVtaWQpLFxuICAgIG5hbWUsXG4gICAgcmFyaXR5LFxuICAgIHJhcml0eW5hbWUsXG4gICAgaWNvbjogdHJpbUljb24oaWNvbiksXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB7IGlzRW51bSB9IGZyb20gXCIuLi90c191dGlsXCJcbmltcG9ydCB7IGxvYWRGYXZvdXJpdGVzIH0gZnJvbSBcIi4uL3VpL2Zhdm91cml0ZXNcIlxuaW1wb3J0IHsgbG9hZEFwcGVhcmFuY2VVSSB9IGZyb20gXCIuL2FwcGVhcmFuY2VfdWlcIlxuaW1wb3J0IHtcbiAgY2F0ZWdvcnlDb250YWluZXJEYXRhU2V0LFxuICBjYXRlZ29yeUdyb3VwRGF0YVNldCxcbiAgaXRlbURhdGFTZXQsXG59IGZyb20gXCIuL2RhdGFfc2V0XCJcbmltcG9ydCB7IEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUgfSBmcm9tIFwiLi9lbnVtcy9hcHBlYXJhbmNlX2NhdGVnb3J5X2NvZGUuZW51bVwiXG5pbXBvcnQgeyBvcGVuQ2F0ZWdvcnksIG9wZW5Hcm91cCB9IGZyb20gXCIuL2Zhdm91cml0ZXNfYWN0aW9uc1wiXG5pbXBvcnQgeyBsb2FkSGlkZGVuQ2F0ZWdvcnksIHVubG9hZEhpZGRlbkNhdGVnb3JpZXMgfSBmcm9tIFwiLi9oaWRkZW5cIlxuaW1wb3J0IHdhcmRyb2JlIGZyb20gXCIuL3dhcmRyb2JlXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWREcmVzc2luZ0V4cGVyaWVuY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghbG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aChcIi9wbGF5ZXIvYXBwZWFyYW5jZVwiKSkgcmV0dXJuXG5cbiAgaGFuZGxlZENhdGVnb3JpZXMuY2xlYXIoKVxuICBsb2FkaW5nID0gZmFsc2VcblxuICBsb2FkQXBwZWFyYW5jZVVJKClcblxuICAvLyBTZXR1cCBjYXRlZ29yaWVzXG4gIGZvciAoY29uc3QgbGkgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MTElFbGVtZW50PihcbiAgICBcIiN3YXJkcm9iZS1tZW51PmxpLCAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yaWVzIGxpXCJcbiAgKSkge1xuICAgIGNvbnN0IHsgY2F0ZWdvcnkgfSA9IGxpLmRhdGFzZXRcbiAgICBpZiAoIWlzRW51bShjYXRlZ29yeSwgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZSkpIGNvbnRpbnVlXG5cbiAgICBzd2l0Y2ggKGNhdGVnb3J5KSB7XG4gICAgICBjYXNlIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUuYmFja2dyb3VuZDpcbiAgICAgICAgbGkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlZS1jYXRlZ29yeVwiKT8ucmVtb3ZlKClcbiAgICAgICAgKVxuICAgICAgICBjb250aW51ZVxuICAgICAgY2FzZSBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLmZhdm9yaXRlczpcbiAgICAgICAgbGkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVlLWNhdGVnb3J5XCIpPy5yZW1vdmUoKVxuICAgICAgICAgIHZvaWQgaGFuZGxlQ2F0ZWdvcnkoY2F0ZWdvcnkpXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICBjYXNlIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUuYXR0aWM6XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsaS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgIGRvY3VtZW50XG4gICAgICAgICAgICAuZ2V0RWxlbWVudEJ5SWQoXCJhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LWZhdm9yaXRlc1wiKVxuICAgICAgICAgICAgPy5yZW1vdmUoKVxuICAgICAgICAgIHZvaWQgaGFuZGxlQ2F0ZWdvcnkoY2F0ZWdvcnkpXG4gICAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKVxuICBhd2FpdCBsb2FkQmFja2dyb3VuZCgpXG59XG5cbi8qKlxuICogR2V0IHRoZSBjYXRlZ29yeSBjb250YWluZXIgZm9yIHRoZSBjbGlja2VkIGNhdGVnb3J5IGFuZCBsb2FkIGl0cyBncm91cHNcbiAqIEByZXR1cm5zIENhdGVnb3J5IGNvbnRhaW5lclxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVDYXRlZ29yeShcbiAgY2F0ZWdvcnk6IEFwcGVhcmFuY2VDYXRlZ29yeUNvZGVcbik6IFByb21pc2U8SFRNTERpdkVsZW1lbnQgfCBudWxsPiB7XG4gIGNvbnN0IGFwcGVhcmFuY2VJdGVtcyA9XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXCIjYXBwZWFyYW5jZS1pdGVtc1wiKVxuICBpZiAoIWFwcGVhcmFuY2VJdGVtcykgcmV0dXJuIG51bGxcblxuICBjb25zdCBvbGRDYXRDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcbiAgICBgI2FwcGVhcmFuY2UtaXRlbXMtY2F0ZWdvcnktJHtjYXRlZ29yeX1gXG4gIClcblxuICBpZiAob2xkQ2F0Q29udGFpbmVyKSB7XG4gICAgYXdhaXQgb25BcHBlYXJhbmNlSXRlbXNDYXRlZ29yeShjYXRlZ29yeSwgYXBwZWFyYW5jZUl0ZW1zLCBvbGRDYXRDb250YWluZXIpXG4gICAgcmV0dXJuIG9sZENhdENvbnRhaW5lclxuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKChfLCBvYnNlcnZlcikgPT4ge1xuICAgICAgY29uc3QgbmV3Q2F0Q29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgICAgIGAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS0ke2NhdGVnb3J5fWBcbiAgICAgIClcbiAgICAgIGlmICghbmV3Q2F0Q29udGFpbmVyKSByZXR1cm5cbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKVxuXG4gICAgICB2b2lkIChhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGF3YWl0IG9uQXBwZWFyYW5jZUl0ZW1zQ2F0ZWdvcnkoXG4gICAgICAgICAgY2F0ZWdvcnksXG4gICAgICAgICAgYXBwZWFyYW5jZUl0ZW1zLFxuICAgICAgICAgIG5ld0NhdENvbnRhaW5lclxuICAgICAgICApXG4gICAgICAgIHJlc29sdmUobmV3Q2F0Q29udGFpbmVyKVxuICAgICAgfSkoKVxuICAgIH0pLm9ic2VydmUoYXBwZWFyYW5jZUl0ZW1zLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KVxuICB9KVxufVxuXG5hc3luYyBmdW5jdGlvbiBvbkFwcGVhcmFuY2VJdGVtc0NhdGVnb3J5KFxuICBjYXRlZ29yeTogQXBwZWFyYW5jZUNhdGVnb3J5Q29kZSxcbiAgYXBwZWFyYW5jZUl0ZW1zOiBIVE1MRGl2RWxlbWVudCxcbiAgY2F0ZWdvcnlDb250YWluZXI6IEhUTUxEaXZFbGVtZW50XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGNhdGVnb3J5ID09PSBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLmZhdm9yaXRlcykgbG9hZEZhdm91cml0ZXMoKVxuICBlbHNlIHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMjIwKSlcbiAgICBsb2FkRWVJdGVtcyhhcHBlYXJhbmNlSXRlbXMsIGNhdGVnb3J5Q29udGFpbmVyKVxuICAgIGF3YWl0IGhhbmRsZUdyb3VwcyhjYXRlZ29yeUNvbnRhaW5lcilcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2FkRWVJdGVtcyhcbiAgYXBwZWFyYW5jZUl0ZW1zOiBIVE1MRGl2RWxlbWVudCxcbiAgY2F0ZWdvcnlDb250YWluZXI6IEhUTUxEaXZFbGVtZW50XG4pOiBIVE1MRGl2RWxlbWVudCB8IG51bGwge1xuICAvLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgY2F0ZWdvcnlcbiAgY29uc3QgYXBwZWFyYW5jZUNhdGVnb3J5ID0gY2F0ZWdvcnlDb250YWluZXJEYXRhU2V0KGNhdGVnb3J5Q29udGFpbmVyKVxuICBpZiAoIWFwcGVhcmFuY2VDYXRlZ29yeSkgcmV0dXJuIG51bGxcbiAgd2FyZHJvYmUuc2V0Q2F0ZWdvcnkoYXBwZWFyYW5jZUNhdGVnb3J5KVxuICBjYXRlZ29yeUNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpXG4gIGNhdGVnb3J5Q29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxuXG4gIC8vIFNldHVwIGFwcGVhcmFuY2VfaXRlbXNfY2F0ZWdvcnlcbiAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2FwcGVhcmFuY2VfaXRlbXNfY2F0ZWdvcnkuaHRtbFwiKVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVlLWNhdGVnb3J5XCIpPy5yZW1vdmUoKVxuICBhcHBlYXJhbmNlSXRlbXMuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgdGVtcGxhdGUucmVuZGVyKHsgLi4uYXBwZWFyYW5jZUNhdGVnb3J5LCB0cmFuc2xhdGUgfSlcbiAgKVxuXG4gIGNvbnN0IGVlSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcIiNlZS1pdGVtc1wiKVxuICBpZiAoIWVlSXRlbXMpIHJldHVybiBudWxsXG4gIGVlSXRlbXMuZGF0YXNldC5jYXRlZ29yeWlkID0gYXBwZWFyYW5jZUNhdGVnb3J5LmNhdGVnb3J5aWQudG9TdHJpbmcoKVxuICBlZUl0ZW1zLmRhdGFzZXQuY2F0ZWdvcnkgPSBhcHBlYXJhbmNlQ2F0ZWdvcnkuY2F0ZWdvcnlcbiAgZWVJdGVtcy5kYXRhc2V0LmNhdGVnb3J5bmFtZSA9IGFwcGVhcmFuY2VDYXRlZ29yeS5jYXRlZ29yeW5hbWVcbiAgcmV0dXJuIGVlSXRlbXNcbn1cblxuY29uc3QgaGFuZGxlZENhdGVnb3JpZXMgPSBuZXcgU2V0PEFwcGVhcmFuY2VDYXRlZ29yeUNvZGU+KClcblxuLyoqIExvYWQgZWFjaCBncm91cHMgc3luY2hyb25vdXNseSBhbmQgYWRkIHRoZW0gdG8gYSBjdXN0b20gY29udGFpbmVyLiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFuZGxlR3JvdXBzKGNhdGVnb3J5Q29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcHBlYXJhbmNlQ2F0ZWdvcnkgPSBjYXRlZ29yeUNvbnRhaW5lckRhdGFTZXQoY2F0ZWdvcnlDb250YWluZXIpXG4gIGlmICghYXBwZWFyYW5jZUNhdGVnb3J5KSByZXR1cm5cbiAgd2FyZHJvYmUuc2V0Q2F0ZWdvcnkoYXBwZWFyYW5jZUNhdGVnb3J5KVxuICBjYXRlZ29yeUNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpXG4gIGNhdGVnb3J5Q29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxuXG4gIGNvbnN0IGhhbmRsZWQgPSBoYW5kbGVkQ2F0ZWdvcmllcy5oYXMoYXBwZWFyYW5jZUNhdGVnb3J5LmNhdGVnb3J5KVxuICBoYW5kbGVkQ2F0ZWdvcmllcy5hZGQoYXBwZWFyYW5jZUNhdGVnb3J5LmNhdGVnb3J5KVxuXG4gIGxvYWRIaWRkZW5DYXRlZ29yeShhcHBlYXJhbmNlQ2F0ZWdvcnkuY2F0ZWdvcnkpXG4gIGZvciAoY29uc3QgbGkgb2YgY2F0ZWdvcnlDb250YWluZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MTElFbGVtZW50PihcbiAgICBcImxpLmFwcGVhcmFuY2UtaXRlbS1ncm91cFwiXG4gICkpIHtcbiAgICBjb25zdCBhcHBlYXJhbmNlR3JvdXAgPSBjYXRlZ29yeUdyb3VwRGF0YVNldChsaSwgYXBwZWFyYW5jZUNhdGVnb3J5KVxuICAgIGlmICghYXBwZWFyYW5jZUdyb3VwPy5ncm91cCkgYnJlYWtcbiAgICB3YXJkcm9iZS5zZXRHcm91cChhcHBlYXJhbmNlR3JvdXApXG5cbiAgICBpZiAoXG4gICAgICAhZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgYCNhcHBlYXJhbmNlLWl0ZW1zLWdyb3VwLSR7YXBwZWFyYW5jZUdyb3VwLmdyb3VwfWBcbiAgICAgICkgJiZcbiAgICAgICFoYW5kbGVkXG4gICAgICAvLyAmJiAhbG9hZEhpZGRlbkdyb3VwKGFwcGVhcmFuY2VHcm91cC5ncm91cClcbiAgICApXG4gICAgICBhd2FpdCBvcGVuR3JvdXAoYXBwZWFyYW5jZUdyb3VwLmdyb3VwKVxuXG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgICBgI2FwcGVhcmFuY2UtaXRlbXMtZ3JvdXAtJHthcHBlYXJhbmNlR3JvdXAuZ3JvdXB9YFxuICAgIClcbiAgICBpZiAoIWRpdikgYnJlYWtcbiAgICBkaXYuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKVxuXG4gICAgY29uc3Qgc2NyaXB0ID0gZGl2LnF1ZXJ5U2VsZWN0b3IoXCJzY3JpcHRcIikgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbXBsaWVkLWV2YWxcbiAgICBpZiAoc2NyaXB0KSBzZXRUaW1lb3V0KHNjcmlwdC5pbm5lckhUTUwsIDApXG5cbiAgICBjb25zdCBvdXRlckhUTUwgPSBBcnJheS5mcm9tKFxuICAgICAgZGl2LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTExJRWxlbWVudD4oXCJsaS5hcHBlYXJhbmNlLWl0ZW1cIilcbiAgICApXG4gICAgICAubWFwKGxpID0+IHtcbiAgICAgICAgY29uc3QgYXBwZWFyYW5jZUl0ZW0gPSBpdGVtRGF0YVNldChsaSwgYXBwZWFyYW5jZUdyb3VwKVxuICAgICAgICBpZiAoIWFwcGVhcmFuY2VJdGVtPy5pY29uKSByZXR1cm4gbGkub3V0ZXJIVE1MXG5cbiAgICAgICAgbGkuZGF0YXNldC5jYXRlZ29yeWlkID0gYXBwZWFyYW5jZUl0ZW0uY2F0ZWdvcnlpZC50b1N0cmluZygpXG4gICAgICAgIGxpLmRhdGFzZXQuY2F0ZWdvcnkgPSBhcHBlYXJhbmNlSXRlbS5jYXRlZ29yeVxuICAgICAgICBsaS5kYXRhc2V0LmNhdGVnb3J5bmFtZSA9IGFwcGVhcmFuY2VJdGVtLmNhdGVnb3J5bmFtZVxuICAgICAgICBsaS5kYXRhc2V0Lmdyb3VwID0gYXBwZWFyYW5jZUl0ZW0uZ3JvdXAudG9TdHJpbmcoKVxuICAgICAgICB3YXJkcm9iZS5zZXRJdGVtKGFwcGVhcmFuY2VJdGVtKVxuXG4gICAgICAgIHJldHVybiBsaS5vdXRlckhUTUxcbiAgICAgIH0pXG4gICAgICAuam9pbihcIlxcblwiKVxuICAgIHdhcmRyb2JlLmF2YWlsYWJsZUl0ZW1zID0gYXZhaWxhYmxlSXRlbXNcblxuICAgIGRpdi5yZW1vdmUoKVxuXG4gICAgY29uc3QgYWN0aXZlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgIGAjd2FyZHJvYmUtbWVudSBsaVtkYXRhLWNhdGVnb3J5PVwiJHthcHBlYXJhbmNlR3JvdXAuY2F0ZWdvcnl9XCJdLmFjdGl2ZWBcbiAgICApXG5cbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICBkb2N1bWVudFxuICAgICAgICAucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXCIjZWUtaXRlbXNcIilcbiAgICAgICAgPy5pbnNlcnRBZGphY2VudEhUTUwoXCJiZWZvcmVlbmRcIiwgb3V0ZXJIVE1MKVxuXG4gICAgICBpbml0aWFsaXplU2VsZWN0ZWRJdGVtcygpXG4gICAgICBpbml0aWFsaXplSGlkZGVuQ2F0ZWdvcmllcygpXG4gICAgfSBlbHNlIGlmIChoYW5kbGVkKSBicmVha1xuICB9XG5cbiAgaWYgKCFoYW5kbGVkKSBoYW5kbGVkQ2F0ZWdvcmllcy5kZWxldGUoYXBwZWFyYW5jZUNhdGVnb3J5LmNhdGVnb3J5KVxuICB1bmxvYWRIaWRkZW5DYXRlZ29yaWVzKClcbn1cblxubGV0IGxvYWRpbmcgPSBmYWxzZVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEJhY2tncm91bmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChsb2FkaW5nKSByZXR1cm5cbiAgbG9hZGluZyA9IHRydWVcbiAgbGV0IHN1Y2Nlc3MgPSB0cnVlXG5cbiAgY29uc3QgY2F0ZWdvcmllcyA9IFtcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLnVuZGVyd2VhcixcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLnNraW4sXG4gICAgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS50YXRvbyxcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLm1vdXRoLFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUuZXllLFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUuaGFpcixcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLnNvY2ssXG4gICAgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS5zaG9lLFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUucGFudHMsXG4gICAgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS5oYW5kQWNjZXNzb3J5LFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUudG9wLFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUuY29hdCxcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLmdsb3ZlLFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUubmVja2xhY2UsXG4gICAgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS5kcmVzcyxcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLmhhdCxcbiAgICBBcHBlYXJhbmNlQ2F0ZWdvcnlDb2RlLmZhY2VBY2Nlc3NvcnksXG4gICAgQXBwZWFyYW5jZUNhdGVnb3J5Q29kZS5iZWx0LFxuICAgIEFwcGVhcmFuY2VDYXRlZ29yeUNvZGUuYW1iaWVudCxcbiAgXVxuXG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9mbGF2cl9ub3RpZi9pY29uX21lc3NhZ2UuaHRtbFwiKVxuXG4gIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgY2F0ZWdvcmllcykge1xuICAgIGlmICghbG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aChcIi9wbGF5ZXIvYXBwZWFyYW5jZVwiKSkge1xuICAgICAgc3VjY2VzcyA9IGZhbHNlXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBgI3dhcmRyb2JlLW1lbnUgbGlbZGF0YS1jYXRlZ29yeT1cIiR7Y2F0ZWdvcnl9XCJdLmFjdGl2ZWBcbiAgICApXG4gICAgaWYgKGFjdGl2ZSkgY29udGludWVcblxuICAgIGNvbnN0IGNhdGVnb3J5Q29udGFpbmVyID0gYXdhaXQgb3BlbkNhdGVnb3J5KGNhdGVnb3J5KVxuICAgIGlmICghY2F0ZWdvcnlDb250YWluZXIpIHtcbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBsZXQgZmluaXNoZWQgPSBmYWxzZVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFmaW5pc2hlZClcbiAgICAgICAgJC5mbGF2ck5vdGlmKFxuICAgICAgICAgIHRlbXBsYXRlLnJlbmRlcih7XG4gICAgICAgICAgICBpY29uOiBgL3N0YXRpYy9pbWcvbWFsbC9jYXRlZ29yaWVzLyR7Y2F0ZWdvcnl9LnBuZ2AsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cmFuc2xhdGUuYXBwZWFyYW5jZS5sb2FkaW5nKFxuICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxMSUVsZW1lbnQ+KFxuICAgICAgICAgICAgICAgIGAjd2FyZHJvYmUtbWVudSBsaVtkYXRhLWNhdGVnb3J5PVwiJHtjYXRlZ29yeX1cIl1gXG4gICAgICAgICAgICAgICk/LmRhdGFzZXQuY2F0ZWdvcnluYW1lID8/IGNhdGVnb3J5XG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICB9LCAxMDAwKVxuXG4gICAgYXdhaXQgaGFuZGxlR3JvdXBzKGNhdGVnb3J5Q29udGFpbmVyKVxuICAgIGZpbmlzaGVkID0gdHJ1ZVxuICB9XG5cbiAgaWYgKHN1Y2Nlc3MpICQuZmxhdnJOb3RpZih0cmFuc2xhdGUuYXBwZWFyYW5jZS5sb2FkZWQpXG4gIGxvYWRpbmcgPSBmYWxzZVxufVxuIiwiZXhwb3J0IGVudW0gQXBwZWFyYW5jZUNhdGVnb3J5Q29kZSB7XG4gIGF0dGljID0gXCJhdHRpY1wiLFxuICBmYXZvcml0ZXMgPSBcImZhdm9yaXRlc1wiLFxuICB1bmRlcndlYXIgPSBcInVuZGVyd2VhclwiLFxuICBza2luID0gXCJza2luXCIsXG4gIHRhdG9vID0gXCJ0YXRvb1wiLFxuICBtb3V0aCA9IFwibW91dGhcIixcbiAgZXllID0gXCJleWVcIixcbiAgaGFpciA9IFwiaGFpclwiLFxuICBzb2NrID0gXCJzb2NrXCIsXG4gIHNob2UgPSBcInNob2VcIixcbiAgcGFudHMgPSBcInBhbnRzXCIsXG4gIGhhbmRBY2Nlc3NvcnkgPSBcImhhbmRBY2Nlc3NvcnlcIixcbiAgdG9wID0gXCJ0b3BcIixcbiAgY29hdCA9IFwiY29hdFwiLFxuICBnbG92ZSA9IFwiZ2xvdmVcIixcbiAgbmVja2xhY2UgPSBcIm5lY2tsYWNlXCIsXG4gIGRyZXNzID0gXCJkcmVzc1wiLFxuICBoYXQgPSBcImhhdFwiLFxuICBmYWNlQWNjZXNzb3J5ID0gXCJmYWNlQWNjZXNzb3J5XCIsXG4gIGJhY2tncm91bmQgPSBcImJhY2tncm91bmRcIixcbiAgYmVsdCA9IFwiYmVsdFwiLFxuICBhbWJpZW50ID0gXCJhbWJpZW50XCIsXG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgaW5kZXhlZF9kYiBmcm9tIFwiLi4vaW5kZXhlZF9kYi9pbmRleGVkX2RiXCJcbmltcG9ydCB7IHBhcnNlQXZhdGFyIH0gZnJvbSBcIi4uL291dGZpdFwiXG5pbXBvcnQgeyBsb2FkRmFrZUZhdm91cml0ZXMgfSBmcm9tIFwiLi4vdWkvZmF2b3VyaXRlc1wiXG5pbXBvcnQgeyB3ZWFyT3V0Zml0IH0gZnJvbSBcIi4vZmF2b3VyaXRlc19hY3Rpb25zXCJcbmltcG9ydCB0eXBlIHsgRmF2b3VyaXRlT3V0Zml0IH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9mYXZvdXJpdGVfb3V0Zml0XCJcbmltcG9ydCB0eXBlIHsgUGFyc2FibGVJdGVtIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9wYXJzYWJsZV9pdGVtXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVGYXZvdXJpdGUoKTogUHJvbWlzZTxGYXZvdXJpdGVPdXRmaXQgfCBudWxsPiB7XG4gIGNvbnN0IGZhdm91cml0ZSA9IGF3YWl0IHNob3dPdXRmaXQoKVxuICBpZiAoZmF2b3VyaXRlKSBhd2FpdCBsb2FkRmFrZUZhdm91cml0ZXMoKVxuICByZXR1cm4gZmF2b3VyaXRlXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUZhdm91cml0ZShmYXZvdXJpdGU6IEZhdm91cml0ZU91dGZpdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBpbmRleGVkX2RiLmRlbGV0ZUZhdm91cml0ZU91dGZpdChmYXZvdXJpdGUpXG4gIGF3YWl0IGxvYWRGYWtlRmF2b3VyaXRlcygpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dPdXRmaXQoKTogUHJvbWlzZTxGYXZvdXJpdGVPdXRmaXQgfCBudWxsPiB7XG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9jcmVhdGVkX291dGZpdF9mbGF2ci5odG1sXCIpXG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT5cbiAgICAkLmZsYXZyKHtcbiAgICAgIGNvbnRlbnQ6IHRlbXBsYXRlLnJlbmRlcih7IHRyYW5zbGF0ZSB9KSxcbiAgICAgIG9uQnVpbGQ6ICRjb250YWluZXIgPT4ge1xuICAgICAgICAkY29udGFpbmVyLmFkZENsYXNzKFwibmV3LWxheW91dC1wb3B1cFwiKVxuICAgICAgICAkY29udGFpbmVyLmFkZENsYXNzKFwiY3JlYXRlZC1vdXRmaXQtcG9wdXBcIilcblxuICAgICAgICBjb25zdCBzYXZlQnV0dG9uID1cbiAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxCdXR0b25FbGVtZW50PignW3JlbD1cImJ0bi1zYXZlXCJdJylcbiAgICAgICAgaWYgKCFzYXZlQnV0dG9uKSByZXR1cm5cblxuICAgICAgICBkb2N1bWVudFxuICAgICAgICAgIC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KFwiI2Nob29zZS1uYW1lXCIpXG4gICAgICAgICAgPy5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgZXZlbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSBzYXZlQnV0dG9uLmNsaWNrKClcblxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oXCIjY2hvb3NlLW5hbWVcIik/LnZhbHVlKVxuICAgICAgICAgICAgICBzYXZlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJkaXNhYmxlZFwiKVxuICAgICAgICAgICAgZWxzZSBzYXZlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJkaXNhYmxlZFwiKVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgc2F2ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibmwtYnV0dG9uXCIsIFwibmwtYnV0dG9uLWxnXCIsIFwiZGlzYWJsZWRcIilcbiAgICAgIH0sXG4gICAgICBidXR0b25zOiB7XG4gICAgICAgIGNsb3NlOiB7XG4gICAgICAgICAgdGV4dDogXCJcIixcbiAgICAgICAgICBzdHlsZTogXCJjbG9zZVwiLFxuICAgICAgICAgIGFjdGlvbjogKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzYXZlOiB7XG4gICAgICAgICAgdGV4dDogdHJhbnNsYXRlLmFwcGVhcmFuY2UuZmF2b3VyaXRlcy5zYXZlX291dGZpdC5zYXZlLFxuICAgICAgICAgIHN0eWxlOiBcImRlZmF1bHRcIixcbiAgICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPVxuICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KFwiI2Nob29zZS1uYW1lXCIpPy52YWx1ZVxuICAgICAgICAgICAgaWYgKCFuYW1lKSByZXR1cm4gZmFsc2VcblxuICAgICAgICAgICAgY29uc3QgYXZhdGFyID0gU2FjaGEuQXZhdGFyLmF2YXRhcnNbXCIjYXBwZWFyYW5jZS1wcmV2aWV3XCJdXG4gICAgICAgICAgICBpZiAoIWF2YXRhcikgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHBhcnNlQXZhdGFyKGF2YXRhcilcblxuICAgICAgICAgICAgdm9pZCBzYXZlQWN0aW9uKG5hbWUsIGl0ZW1zLCByZXNvbHZlKVxuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG93RmF2b3VyaXRlKGZhdm91cml0ZTogRmF2b3VyaXRlT3V0Zml0KTogdm9pZCB7XG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9mYXZvdXJpdGVfb3V0Zml0X2ZsYXZyLmh0bWxcIilcblxuICAkLmZsYXZyKHtcbiAgICBjb250ZW50OiB0ZW1wbGF0ZS5yZW5kZXIoeyAuLi5mYXZvdXJpdGUsIHRyYW5zbGF0ZSB9KSxcbiAgICBvbkJ1aWxkOiAkY29udGFpbmVyID0+IHtcbiAgICAgICRjb250YWluZXIuYWRkQ2xhc3MoXCJuZXctbGF5b3V0LXBvcHVwXCIpXG4gICAgICAkY29udGFpbmVyLmFkZENsYXNzKFwiY3JlYXRlZC1vdXRmaXQtcG9wdXBcIilcbiAgICB9LFxuICAgIGJ1dHRvbnM6IHtcbiAgICAgIGNsb3NlOiB7XG4gICAgICAgIHRleHQ6IFwiXCIsXG4gICAgICAgIHN0eWxlOiBcImNsb3NlXCIsXG4gICAgICAgIGFjdGlvbjogKCkgPT4gdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBkZWxldGU6IHtcbiAgICAgICAgdGV4dDogdHJhbnNsYXRlLmFwcGVhcmFuY2UuZmF2b3VyaXRlcy5jbGlja19vdXRmaXQuZGVsZXRlLFxuICAgICAgICBzdHlsZTogXCJkZWZhdWx0XCIsXG4gICAgICAgIGFjdGlvbjogKCkgPT4ge1xuICAgICAgICAgIHZvaWQgZGVsZXRlRmF2b3VyaXRlKGZhdm91cml0ZSlcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHdlYXI6IHtcbiAgICAgICAgdGV4dDogdHJhbnNsYXRlLmFwcGVhcmFuY2UuZmF2b3VyaXRlcy5jbGlja19vdXRmaXQud2VhcixcbiAgICAgICAgc3R5bGU6IFwiZGVmYXVsdFwiLFxuICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBhdmF0YXIgPSBTYWNoYS5BdmF0YXIuYXZhdGFyc1tcIiNhcHBlYXJhbmNlLXByZXZpZXdcIl1cbiAgICAgICAgICBpZiAoIWF2YXRhcikgcmV0dXJuIGZhbHNlXG5cbiAgICAgICAgICB2b2lkIChhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgICAgICAgICAgd2Vhck91dGZpdChhdmF0YXIsIGZhdm91cml0ZS5pdGVtcykpKClcblxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0pXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVBY3Rpb24oXG4gIG5hbWU6IHN0cmluZyxcbiAgaXRlbXM6IFBhcnNhYmxlSXRlbVtdLFxuICByZXNvbHZlOiAodmFsdWU6IEZhdm91cml0ZU91dGZpdCkgPT4gdm9pZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJsb2IgPSBhd2FpdCBuZXcgUHJvbWlzZTxCbG9iPihyZXNvbHZlID0+IHtcbiAgICBkb2N1bWVudFxuICAgICAgLnF1ZXJ5U2VsZWN0b3I8SFRNTENhbnZhc0VsZW1lbnQ+KFwiI2FwcGVhcmFuY2UtcHJldmlldyBjYW52YXNcIilcbiAgICAgID8udG9CbG9iKGJsb2IgPT4gcmVzb2x2ZShibG9iISksIFwiaW1hZ2UvcG5nXCIsIDEpXG4gIH0pXG5cbiAgcmVzb2x2ZSh7XG4gICAgLi4uKGF3YWl0IGluZGV4ZWRfZGIuYWRkRmF2b3VyaXRlT3V0Zml0KHtcbiAgICAgIGl0ZW1zLFxuICAgICAgbmFtZSxcbiAgICAgIGJsb2IsXG4gICAgfSkpLFxuICAgIHVybDogVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSxcbiAgfSlcbn1cbiIsImltcG9ydCB0eXBlIHsgQXZhdGFyIH0gZnJvbSBcIi4uL2VsZGFyeWEvYXZhdGFyXCJcbmltcG9ydCB0eXBlIHsgSXRlbSB9IGZyb20gXCIuLi9lbGRhcnlhL2l0ZW1cIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB7IGV4cG9ydE91dGZpdCB9IGZyb20gXCIuLi9vdXRmaXRcIlxuaW1wb3J0IHR5cGUgeyBQYXJzYWJsZUl0ZW0gfSBmcm9tIFwiLi9pbnRlcmZhY2VzL3BhcnNhYmxlX2l0ZW1cIlxuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0UHJldmlldygpOiB2b2lkIHtcbiAgZXhwb3J0T3V0Zml0KFwiI2FwcGVhcmFuY2UtcHJldmlld1wiKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW1wb3J0T3V0Zml0KCk6IHZvaWQge1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKVxuICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiZmlsZVwiKVxuICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJhY2NlcHRcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpXG4gIGlucHV0LmNsaWNrKClcblxuICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZXZlbnQgPT4ge1xuICAgIGlmICghZXZlbnQudGFyZ2V0KSByZXR1cm5cbiAgICBjb25zdCBmaWxlcyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuZmlsZXNcbiAgICBpZiAoIWZpbGVzKSByZXR1cm5cbiAgICBjb25zdCBmaWxlID0gZmlsZXNbMF1cbiAgICBpZiAoIWZpbGUpIHJldHVyblxuICAgIHZvaWQgZmlsZS50ZXh0KCkudGhlbihhc3luYyB2YWx1ZSA9PiB7XG4gICAgICBpZiAoIXZhbHVlKSByZXR1cm5cblxuICAgICAgY29uc3Qgb3V0Zml0OiBQYXJzYWJsZUl0ZW1bXSA9IEpTT04ucGFyc2UodmFsdWUpXG4gICAgICBjb25zdCBhdmF0YXIgPSBTYWNoYS5BdmF0YXIuYXZhdGFyc1tcIiNhcHBlYXJhbmNlLXByZXZpZXdcIl1cbiAgICAgIGlmICghYXZhdGFyKSByZXR1cm5cblxuICAgICAgYXdhaXQgd2Vhck91dGZpdChhdmF0YXIsIG91dGZpdClcbiAgICB9KVxuICB9KVxufVxuXG5mdW5jdGlvbiByZW1vdmVDbG90aGVzKCk6IHZvaWQge1xuICBjb25zdCBhdmF0YXIgPSBTYWNoYS5BdmF0YXIuYXZhdGFyc1tcIiNhcHBlYXJhbmNlLXByZXZpZXdcIl1cbiAgaWYgKCFhdmF0YXIpIHJldHVyblxuXG4gIGZvciAobGV0IGkgPSBhdmF0YXIuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBpdGVtUmVuZGVyID0gYXZhdGFyLmNoaWxkcmVuW2ldXG4gICAgaWYgKCFpdGVtUmVuZGVyKSBjb250aW51ZVxuXG4gICAgY29uc3QgaXRlbSA9IGl0ZW1SZW5kZXIuZ2V0SXRlbSgpXG4gICAgaWYgKFNhY2hhLkF2YXRhci5yZW1vdmVJdGVtRnJvbUFsbEF2YXRhcnMoaXRlbSkpIHtcbiAgICAgICQoYCNhcHBlYXJhbmNlLWl0ZW0tJHtpdGVtLl9pZH1gKS5yZW1vdmVDbGFzcyhcInNlbGVjdGVkXCIpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuR3JvdXAoZ3JvdXA6IG51bWJlcik6IFByb21pc2U8SFRNTERpdkVsZW1lbnQgfCBudWxsPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxIVE1MRGl2RWxlbWVudCB8IG51bGw+KChyZXNvbHZlKTogdm9pZCA9PiB7XG4gICAgY29uc3QgZ3JvdXBDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcbiAgICAgIGAjYXBwZWFyYW5jZS1pdGVtcy1ncm91cC0ke2dyb3VwfWBcbiAgICApXG4gICAgaWYgKGdyb3VwQ29udGFpbmVyKSByZXR1cm4gdm9pZCByZXNvbHZlKGdyb3VwQ29udGFpbmVyKVxuXG4gICAgY29uc3QgYXZhdGFyID0gU2FjaGEuQXZhdGFyLmF2YXRhcnNbXCIjYXBwZWFyYW5jZS1wcmV2aWV3XCJdXG4gICAgaWYgKCFhdmF0YXIpIHJldHVybiB2b2lkIHJlc29sdmUobnVsbClcblxuICAgIHZvaWQgJC5nZXQoXG4gICAgICBgL3BsYXllci9vcGVuR3JvdXAvJHtncm91cH1gLFxuICAgICAgeyB3b3JuSXRlbXM6IGF2YXRhci5nZXRJdGVtc1RvU2F2ZSgpIH0sXG4gICAgICAodmlldzogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgICQodmlldykuaGlkZSgpLmFwcGVuZFRvKFwiI2FwcGVhcmFuY2UtaXRlbXNcIilcbiAgICAgICAgcmVzb2x2ZShcbiAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcbiAgICAgICAgICAgIGAjYXBwZWFyYW5jZS1pdGVtcy1ncm91cC0ke2dyb3VwfWBcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH1cbiAgICApXG4gIH0pXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuQ2F0ZWdvcnkoXG4gIGNhdGVnb3J5OiBzdHJpbmdcbik6IFByb21pc2U8SFRNTERpdkVsZW1lbnQgfCBudWxsPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxIVE1MRGl2RWxlbWVudCB8IG51bGw+KChyZXNvbHZlKTogdm9pZCA9PiB7XG4gICAgY29uc3QgY2F0ZWdvcnlDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcbiAgICAgIGAjYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeS0ke2NhdGVnb3J5fWBcbiAgICApXG4gICAgaWYgKGNhdGVnb3J5Q29udGFpbmVyKSByZXR1cm4gdm9pZCByZXNvbHZlKGNhdGVnb3J5Q29udGFpbmVyKVxuXG4gICAgdm9pZCAkLnBvc3QoYC9wbGF5ZXIvb3BlbkNhdGVnb3J5LyR7Y2F0ZWdvcnl9YCwgKHZpZXc6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgJCh2aWV3KS5oaWRlKCkuYXBwZW5kVG8oXCIjYXBwZWFyYW5jZS1pdGVtc1wiKVxuICAgICAgcmVzb2x2ZShcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgICAgICAgYCNhcHBlYXJhbmNlLWl0ZW1zLWNhdGVnb3J5LSR7Y2F0ZWdvcnl9YFxuICAgICAgICApXG4gICAgICApXG4gICAgfSlcbiAgfSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdlYXJPdXRmaXQoXG4gIGF2YXRhcjogQXZhdGFyLFxuICBvdXRmaXQ6IFBhcnNhYmxlSXRlbVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgJC5mbGF2ck5vdGlmKHRyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuaW1wb3J0aW5nKVxuXG4gIC8vIEdldCBhbGwgY2F0ZWdvcmllc1xuICBjb25zdCBjYXRlZ29yaWVzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgZm9yIChjb25zdCBjbG90aGluZyBvZiBvdXRmaXQpXG4gICAgaWYgKCFhdmFpbGFibGVJdGVtc1tjbG90aGluZy5pZF0pIGNhdGVnb3JpZXMuYWRkKGNsb3RoaW5nLnR5cGUpXG5cbiAgLy8gT3BlbiBhbGwgY2F0ZWdvcmllc1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBBcnJheS5mcm9tKGNhdGVnb3JpZXMudmFsdWVzKCkpLm1hcChhc3luYyBjYXRlZ29yeSA9PlxuICAgICAgb3BlbkNhdGVnb3J5KGNhdGVnb3J5KVxuICAgIClcbiAgKVxuXG4gIC8vIEdldCBhbGwgZ3JvdXBzXG4gIGNvbnN0IGdyb3VwcyA9IG5ldyBTZXQ8bnVtYmVyPigpXG4gIGZvciAoY29uc3QgY2xvdGhpbmcgb2Ygb3V0Zml0KVxuICAgIGlmIChcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWdyb3VwPVwiJHtjbG90aGluZy5ncm91cH1cIl1gKSAmJlxuICAgICAgIWF2YWlsYWJsZUl0ZW1zW2Nsb3RoaW5nLmlkXVxuICAgIClcbiAgICAgIGdyb3Vwcy5hZGQoY2xvdGhpbmcuZ3JvdXApXG5cbiAgLy8gT3BlbiBhbGwgZ3JvdXBzXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIEFycmF5LmZyb20oZ3JvdXBzLnZhbHVlcygpKS5tYXAoYXN5bmMgZ3JvdXAgPT4gb3Blbkdyb3VwKGdyb3VwKSlcbiAgKVxuXG4gIC8vIEdldCB0aGUgaXRlbXMgZnJvbSBgYXZhaWxhYmxlSXRlbXNgXG4gIGNvbnN0IHdvcm5JdGVtczogSXRlbVtdID0gW11cbiAgZm9yIChjb25zdCBjbG90aGluZyBvZiBvdXRmaXQpIHtcbiAgICBjb25zdCBpdGVtID0gYXZhaWxhYmxlSXRlbXNbY2xvdGhpbmcuaWRdXG4gICAgaWYgKGl0ZW0pIHdvcm5JdGVtcy5wdXNoKGl0ZW0pXG4gIH1cblxuICByZW1vdmVDbG90aGVzKClcbiAgYXZhdGFyLmFkZEl0ZW1zKHdvcm5JdGVtcylcbiAgaW5pdGlhbGl6ZVNlbGVjdGVkSXRlbXMoKVxuICBpbml0aWFsaXplSGlkZGVuQ2F0ZWdvcmllcygpXG5cbiAgY29uc3QgYXZhdGFyQWN0aW9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYXZhdGFyLWFjdGlvbnNcIilcbiAgaWYgKGF2YXRhckFjdGlvbnMpIGF2YXRhckFjdGlvbnMuc3R5bGUuZGlzcGxheSA9IFwiaW5pdGlhbFwiXG5cbiAgJC5mbGF2ck5vdGlmKHRyYW5zbGF0ZS5hcHBlYXJhbmNlLmZhdm91cml0ZXMuaW1wb3J0ZWQpXG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB0eXBlIHsgQXBwZWFyYW5jZUNhdGVnb3J5IH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2FwcGVhcmFuY2VfY2F0ZWdvcnlcIlxuaW1wb3J0IHR5cGUgeyBBcHBlYXJhbmNlR3JvdXAgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvYXBwZWFyYW5jZV9ncm91cFwiXG5pbXBvcnQgd2FyZHJvYmUgZnJvbSBcIi4vd2FyZHJvYmVcIlxuXG5leHBvcnQgZnVuY3Rpb24gdW5sb2FkSGlkZGVuQ2F0ZWdvcmllcygpOiB2b2lkIHtcbiAgY29uc3QgaGlkZGVuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRGl2RWxlbWVudD4oXG4gICAgXCIjYXBwZWFyYW5jZS1pdGVtcyAuYXBwZWFyYW5jZS1pdGVtcy1jYXRlZ29yeTpub3QoLmFjdGl2ZSk6bm90KFtkYXRhLWNhdGVnb3J5bmFtZV0pLCAjYXBwZWFyYW5jZS1pdGVtcyBzY3JpcHQsIGJvZHk+c2NyaXB0XCJcbiAgKVxuICBmb3IgKGNvbnN0IGRpdiBvZiBoaWRkZW4pIHtcbiAgICBkaXYucmVtb3ZlKClcbiAgfVxufVxuXG4vKipcbiAqIFBsYWNlIHRoZSBzYXZlZCBncm91cHMgb24gdGhlIERPTSBhcyBpZiBpdCB3YXMgRWxkYXJ5YSBkb2luZyBpdC5cbiAqIEByZXR1cm5zIHRoZSBhc3NvY2lhdGVkIGBBcHBlYXJhbmNlQ2F0ZWdvcnlgIGlmIGl0J3MgZm91bmQgaW4gdGhlIHdhcmRyb2JlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEhpZGRlbkNhdGVnb3J5KGNvZGU6IHN0cmluZyk6IEFwcGVhcmFuY2VDYXRlZ29yeSB8IG51bGwge1xuICBjb25zdCBjYXRlZ29yeSA9IHdhcmRyb2JlLmdldENhdGVnb3JpZXMoKS5maW5kKGMgPT4gYy5jYXRlZ29yeSA9PT0gY29kZSlcbiAgaWYgKCFjYXRlZ29yeSkgcmV0dXJuIG51bGxcblxuICBjb25zdCBncm91cHMgPSB3YXJkcm9iZS5nZXRDYXRlZ29yeUdyb3VwcyhjYXRlZ29yeS5jYXRlZ29yeWlkKVxuICBjb25zdCBpdGVtVGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2FwcGVhcmFuY2VfaXRlbS5odG1sXCIpXG4gIGNvbnN0IGdyb3VwVGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2FwcGVhcmFuY2VfaXRlbXNfZ3JvdXAuaHRtbFwiKVxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcIiNhcHBlYXJhbmNlLWl0ZW1zXCIpXG4gICAgPy5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgICBcImJlZm9yZWVuZFwiLFxuICAgICAgZ3JvdXBzXG4gICAgICAgIC5tYXAoZ3JvdXAgPT5cbiAgICAgICAgICBncm91cFRlbXBsYXRlLnJlbmRlcih7XG4gICAgICAgICAgICAuLi5ncm91cCxcbiAgICAgICAgICAgIGl0ZW1zOiB3YXJkcm9iZVxuICAgICAgICAgICAgICAuZ2V0SXRlbXMoZ3JvdXAuZ3JvdXApXG4gICAgICAgICAgICAgIC5tYXAoaXRlbSA9PiBpdGVtVGVtcGxhdGUucmVuZGVyKGl0ZW0pKVxuICAgICAgICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5qb2luKFwiXFxuXCIpXG4gICAgKVxuICByZXR1cm4gY2F0ZWdvcnlcbn1cblxuLyoqXG4gKiBMb2FkIHRoZSBzYXZlZCBncm91cCBvbiB0aGUgRE9NIGFzIGlmIGl0IHdhcyBFbGRhcnlhIGRvaW5nIGl0LlxuICogQHJldHVybnMgdGhlIGFzc29jaWF0ZWQgYEFwcGVhcmFuY2VHcm91cGAgaWYgaXQncyBmb3VuZCBpbiB0aGUgd2FyZHJvYmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkSGlkZGVuR3JvdXAoaWQ6IG51bWJlcik6IEFwcGVhcmFuY2VHcm91cCB8IG51bGwge1xuICBjb25zdCBncm91cCA9IHdhcmRyb2JlLmdldEdyb3VwKGlkKVxuICBpZiAoIWdyb3VwKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IGl0ZW1UZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvYXBwZWFyYW5jZV9pdGVtLmh0bWxcIilcbiAgY29uc3QgZ3JvdXBUZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvYXBwZWFyYW5jZV9pdGVtc19ncm91cC5odG1sXCIpXG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFwiI2FwcGVhcmFuY2UtaXRlbXNcIilcbiAgICA/Lmluc2VydEFkamFjZW50SFRNTChcbiAgICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgICBncm91cFRlbXBsYXRlLnJlbmRlcih7XG4gICAgICAgIC4uLmdyb3VwLFxuICAgICAgICBpdGVtczogd2FyZHJvYmVcbiAgICAgICAgICAuZ2V0SXRlbXMoZ3JvdXAuZ3JvdXApXG4gICAgICAgICAgLm1hcChpdGVtID0+IGl0ZW1UZW1wbGF0ZS5yZW5kZXIoaXRlbSkpXG4gICAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICB9KVxuICAgIClcbiAgcmV0dXJuIGdyb3VwXG59XG4iLCJpbXBvcnQgdHlwZSB7IEl0ZW0gfSBmcm9tIFwiLi4vZWxkYXJ5YS9pdGVtXCJcbmltcG9ydCB0eXBlIHsgQXBwZWFyYW5jZUNhdGVnb3J5IH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2FwcGVhcmFuY2VfY2F0ZWdvcnlcIlxuaW1wb3J0IHR5cGUgeyBBcHBlYXJhbmNlR3JvdXAgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvYXBwZWFyYW5jZV9ncm91cFwiXG5pbXBvcnQgdHlwZSB7IEFwcGVhcmFuY2VJdGVtIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2FwcGVhcmFuY2VfaXRlbVwiXG5cbmNsYXNzIFdhcmRyb2JlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjYXRlZ29yaWVzOiBSZWNvcmQ8bnVtYmVyLCBBcHBlYXJhbmNlQ2F0ZWdvcnk+ID0ge31cblxuICBwcml2YXRlIHJlYWRvbmx5IGdyb3VwczogUmVjb3JkPG51bWJlciwgQXBwZWFyYW5jZUdyb3VwPiA9IHt9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpdGVtczogUmVjb3JkPG51bWJlciwgQXBwZWFyYW5jZUl0ZW0+ID0ge31cblxuICBhdmFpbGFibGVJdGVtcz86IFJlY29yZDxudW1iZXIsIEl0ZW0+XG5cbiAgZ2V0Q2F0ZWdvcmllcygpOiBBcHBlYXJhbmNlQ2F0ZWdvcnlbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5jYXRlZ29yaWVzKVxuICB9XG5cbiAgZ2V0Q2F0ZWdvcnkoaWQ6IG51bWJlcik6IEFwcGVhcmFuY2VDYXRlZ29yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2F0ZWdvcmllc1tpZF1cbiAgfVxuXG4gIGdldENhdGVnb3J5R3JvdXBzKGNhdGVnb3J5aWQ6IG51bWJlcik6IEFwcGVhcmFuY2VHcm91cFtdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmdyb3VwcykuZmlsdGVyKFxuICAgICAgZ3JvdXAgPT4gZ3JvdXAuY2F0ZWdvcnlpZCA9PT0gY2F0ZWdvcnlpZFxuICAgIClcbiAgfVxuXG4gIGdldEdyb3VwKGlkOiBudW1iZXIpOiBBcHBlYXJhbmNlR3JvdXAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdyb3Vwc1tpZF1cbiAgfVxuXG4gIGdldEdyb3VwcygpOiBBcHBlYXJhbmNlR3JvdXBbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5ncm91cHMpXG4gIH1cblxuICBnZXRJdGVtKGlkOiBudW1iZXIpOiBBcHBlYXJhbmNlSXRlbSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNbaWRdXG4gIH1cblxuICBnZXRJdGVtcyhncm91cDogbnVtYmVyKTogQXBwZWFyYW5jZUl0ZW1bXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5pdGVtcykuZmlsdGVyKGl0ZW0gPT4gaXRlbS5ncm91cCA9PT0gZ3JvdXApXG4gIH1cblxuICBzZXRDYXRlZ29yeShjYXRlZ29yeTogQXBwZWFyYW5jZUNhdGVnb3J5KTogdm9pZCB7XG4gICAgdGhpcy5jYXRlZ29yaWVzW2NhdGVnb3J5LmNhdGVnb3J5aWRdID0gY2F0ZWdvcnlcbiAgfVxuXG4gIHNldEdyb3VwKGdyb3VwOiBBcHBlYXJhbmNlR3JvdXApOiB2b2lkIHtcbiAgICB0aGlzLmdyb3Vwc1tncm91cC5ncm91cF0gPSBncm91cFxuICB9XG5cbiAgc2V0SXRlbShpdGVtOiBBcHBlYXJhbmNlSXRlbSk6IHZvaWQge1xuICAgIHRoaXMuaXRlbXNbaXRlbS5pdGVtaWRdID0gaXRlbVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBXYXJkcm9iZSgpXG4iLCJpbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHR5cGUgeyBDYXJvdXNlbE5ld3MgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvY2Fyb3VzZWxfbmV3c1wiXG5cbmV4cG9ydCBjb25zdCBjYXJvdXNlbEJlZW1vb3ZBbm5veWFuY2VzOiBDYXJvdXNlbE5ld3MgPSB7XG4gIGJhY2tncm91bmRJbWFnZTpcbiAgICBcImh0dHBzOi8vZ2l0bGFiLmNvbS9OYXRvQm9yYW0vZWxkYXJ5YS1lbmhhbmNlbWVudHMvLS9yYXcvbWFzdGVyL2ltYWdlcy9jYXJvdXNlbF9iZWVtb292X2Fubm95YW5jZXMucG5nXCIsXG4gIGg0OiB0cmFuc2xhdGUuY2Fyb3VzZWwuYmVlbW9vdl9hbm5veWFuY2VzLnRpdGxlLFxuICBocmVmOiBcImh0dHBzOi8vZ2l0bGFiLmNvbS9OYXRvQm9yYW0vQmVlbW9vdi1Bbm5veWFuY2VzXCIsXG4gIGlkOiBcImNhcm91c2VsLWJlZW1vb3YtYW5ub3lhbmNlc1wiLFxuICBwOiB0cmFuc2xhdGUuY2Fyb3VzZWwuYmVlbW9vdl9hbm5veWFuY2VzLnN1YnRpdGxlLFxufVxuIiwiaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB0eXBlIHsgQ2Fyb3VzZWxOZXdzIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2Nhcm91c2VsX25ld3NcIlxuXG5leHBvcnQgY29uc3QgY2Fyb3VzZWxEb3dubG9hZEZhY2U6IENhcm91c2VsTmV3cyA9IHtcbiAgYmFja2dyb3VuZEltYWdlOlxuICAgIFwiaHR0cHM6Ly9naXRsYWIuY29tL05hdG9Cb3JhbS9lbGRhcnlhLWVuaGFuY2VtZW50cy8tL3Jhdy9tYXN0ZXIvaW1hZ2VzL2Nhcm91c2VsX2Rvd25sb2FkX2ZhY2UucG5nXCIsXG4gIGlkOiBcImNhcm91c2VsLWRvd25sb2FkLWZhY2VcIixcbiAgaDQ6IHRyYW5zbGF0ZS5jYXJvdXNlbC5kb3dubG9hZF9mYWNlLnRpdGxlLFxuICBwOiB0cmFuc2xhdGUuY2Fyb3VzZWwuZG93bmxvYWRfZmFjZS5zdWJ0aXRsZSxcbn1cbiIsImltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgdHlwZSB7IENhcm91c2VsTmV3cyB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9jYXJvdXNlbF9uZXdzXCJcblxuZXhwb3J0IGNvbnN0IGNhcm91c2VsRG93bmxvYWRHdWFyZGlhbjogQ2Fyb3VzZWxOZXdzID0ge1xuICBiYWNrZ3JvdW5kSW1hZ2U6XG4gICAgXCJodHRwczovL2dpdGxhYi5jb20vTmF0b0JvcmFtL2VsZGFyeWEtZW5oYW5jZW1lbnRzLy0vcmF3L21hc3Rlci9pbWFnZXMvY2Fyb3VzZWxfZG93bmxvYWRfZ3VhcmRpYW4ucG5nXCIsXG4gIGlkOiBcImNhcm91c2VsLWRvd25sb2FkLWd1YXJkaWFuXCIsXG4gIGg0OiB0cmFuc2xhdGUuY2Fyb3VzZWwuZG93bmxvYWRfZ3VhcmRpYW4udGl0bGUsXG4gIHA6IHRyYW5zbGF0ZS5jYXJvdXNlbC5kb3dubG9hZF9ndWFyZGlhbi5zdWJ0aXRsZSxcbn1cbiIsImltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgdHlwZSB7IENhcm91c2VsTmV3cyB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9jYXJvdXNlbF9uZXdzXCJcblxuZXhwb3J0IGNvbnN0IGNhcm91c2VsRUU6IENhcm91c2VsTmV3cyA9IHtcbiAgYmFja2dyb3VuZEltYWdlOlxuICAgIFwiaHR0cHM6Ly9naXRsYWIuY29tL05hdG9Cb3JhbS9lbGRhcnlhLWVuaGFuY2VtZW50cy8tL3Jhdy9tYXN0ZXIvaW1hZ2VzL2Nhcm91c2VsX2VsZGFyeWFfZW5oYW5jZW1lbnRzLnBuZ1wiLFxuICBoNDogdHJhbnNsYXRlLmNhcm91c2VsLmVsZGFyeWFfZW5oYW5jZW1lbnRzLnRpdGxlLFxuICBocmVmOiBHTS5pbmZvLnNjcmlwdC5uYW1lc3BhY2UsXG4gIGlkOiBcImNhcm91c2VsLWVsZGFyeWEtZW5oYW5jZW1lbnRzXCIsXG4gIHA6IHRyYW5zbGF0ZS5jYXJvdXNlbC5lbGRhcnlhX2VuaGFuY2VtZW50cy5zdWJ0aXRsZSxcbn1cbiIsImltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgdHlwZSB7IENhcm91c2VsTmV3cyB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9jYXJvdXNlbF9uZXdzXCJcblxuZXhwb3J0IGNvbnN0IGNhcm91c2VsVGFrZW92ZXI6IENhcm91c2VsTmV3cyA9IHtcbiAgYmFja2dyb3VuZEltYWdlOlxuICAgIFwiaHR0cHM6Ly9naXRsYWIuY29tL05hdG9Cb3JhbS9lbGRhcnlhLWVuaGFuY2VtZW50cy8tL3Jhdy9tYXN0ZXIvaW1hZ2VzL2Nhcm91c2VsX3Rha2VvdmVyLnBuZ1wiLFxuICBpZDogXCJjYXJvdXNlbC10YWtlb3ZlclwiLFxuICBoNDogdHJhbnNsYXRlLmNhcm91c2VsLnRha2VvdmVyLnRpdGxlLFxuICBwOiB0cmFuc2xhdGUuY2Fyb3VzZWwudGFrZW92ZXIuc3VidGl0bGUsXG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQ2hlYXRDb2RlcygpOiB2b2lkIHtcbiAgLy8gY29uc3QgY2hlYXRlZCA9IHdpbmRvdyBhcyB1bmtub3duIGFzIENoZWF0ZWRXaW5kb3dcbiAgOyh3aW5kb3cgYXMgdW5rbm93biBhcyBDaGVhdGVkV2luZG93KS51bmxvY2tFbmhhbmNlbWVudHMgPSB1bmxvY2tFbmhhbmNlbWVudHNcbiAgOyh3aW5kb3cgYXMgdW5rbm93biBhcyBDaGVhdGVkV2luZG93KS5sb2NrRW5oYW5jZW1lbnRzID0gbG9ja0VuaGFuY2VtZW50c1xufVxuXG5hc3luYyBmdW5jdGlvbiB1bmxvY2tFbmhhbmNlbWVudHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIExvY2FsU3RvcmFnZS51bmxvY2tlZCA9IHRydWVcbiAgY29uc29sZS5pbmZvKFwiVW5sb2NrZWQgZW5oYW5jZW1lbnRzLlwiKVxuICBhd2FpdCByZWxvYWQoKVxufVxuXG5hc3luYyBmdW5jdGlvbiBsb2NrRW5oYW5jZW1lbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICBMb2NhbFN0b3JhZ2UudW5sb2NrZWQgPSBmYWxzZVxuICBjb25zb2xlLmluZm8oXCJMb2NrZWQgZW5oYW5jZW1lbnRzLlwiKVxuICBhd2FpdCByZWxvYWQoKVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDAwKSlcbiAgY29uc29sZS5sb2coXCJSZWxvYWRpbmcuLi5cIilcbiAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKVxuICBsb2NhdGlvbi5yZWxvYWQoKVxufVxuXG5pbnRlcmZhY2UgQ2hlYXRlZFdpbmRvdyBleHRlbmRzIFdpbmRvdyB7XG4gIHVubG9ja0VuaGFuY2VtZW50czogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICBsb2NrRW5oYW5jZW1lbnRzOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG59XG4iLCJpbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuXG5leHBvcnQgY2xhc3MgQ29uc29sZSB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGNvbnNvbGUgPSBjb25zb2xlXG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0IGRlYnVnZ2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gTG9jYWxTdG9yYWdlLmRlYnVnXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXQgdGltZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpXG4gIH1cblxuICBzdGF0aWMgYXNzZXJ0KFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAuLi5vcHRpb25hbFBhcmFtczogdW5rbm93bltdXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kZWJ1Z2dpbmcpIHJldHVyblxuICAgIHRoaXMuY29uc29sZS5hc3NlcnQodmFsdWUsIC4uLnRoaXMuZm9ybWF0KG1lc3NhZ2UpLCAuLi5vcHRpb25hbFBhcmFtcylcbiAgfVxuXG4gIHN0YXRpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGVidWdnaW5nKSByZXR1cm5cbiAgICB0aGlzLmNvbnNvbGUuZGVidWcoLi4udGhpcy5mb3JtYXQobWVzc2FnZSksIC4uLm9wdGlvbmFsUGFyYW1zKVxuICB9XG5cbiAgc3RhdGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMuY29uc29sZS5lcnJvciguLi50aGlzLmZvcm1hdChtZXNzYWdlKSwgLi4ub3B0aW9uYWxQYXJhbXMpXG4gIH1cblxuICBzdGF0aWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGVidWdnaW5nKSByZXR1cm5cbiAgICB0aGlzLmNvbnNvbGUuaW5mbyguLi50aGlzLmZvcm1hdChtZXNzYWdlKSwgLi4ub3B0aW9uYWxQYXJhbXMpXG4gIH1cblxuICBzdGF0aWMgbG9nKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kZWJ1Z2dpbmcpIHJldHVyblxuICAgIHRoaXMuY29uc29sZS5sb2coLi4udGhpcy5mb3JtYXQobWVzc2FnZSksIC4uLm9wdGlvbmFsUGFyYW1zKVxuICB9XG5cbiAgc3RhdGljIHdhcm4obWVzc2FnZTogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5jb25zb2xlLndhcm4oLi4udGhpcy5mb3JtYXQobWVzc2FnZSksIC4uLm9wdGlvbmFsUGFyYW1zKVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZm9ybWF0KG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgYCVjWyVjJHt0aGlzLnRpbWV9JWNdYCxcbiAgICAgIFwiY29sb3I6Izk3NDJjMlwiLFxuICAgICAgXCJjb2xvcjpub25lXCIsXG4gICAgICBcImNvbG9yOiM5NzQyYzJcIixcbiAgICAgIG1lc3NhZ2UsXG4gICAgXVxuICB9XG59XG4iLCJpbXBvcnQgeyBDb25zb2xlIH0gZnJvbSBcIi4vY29uc29sZVwiXG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi9pMThuL3RyYW5zbGF0ZVwiXG5cbmZ1bmN0aW9uIGRvd25sb2FkQ2FudmFzKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBjYW52YXMudG9CbG9iKFxuICAgIGJsb2IgPT4ge1xuICAgICAgaWYgKCFibG9iKSB7XG4gICAgICAgIENvbnNvbGUuZXJyb3IoXCJDYW52YXMgaXMgZW1wdHlcIilcbiAgICAgICAgJC5mbGF2ck5vdGlmKHRyYW5zbGF0ZS5lcnJvci5kb3dubG9hZENhbnZhcylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcblxuICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpXG4gICAgICBhLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgdXJsKVxuICAgICAgYS5zZXRBdHRyaWJ1dGUoXCJkb3dubG9hZFwiLCBgJHtuYW1lfS5wbmdgKVxuICAgICAgYS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcblxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKVxuICAgICAgYS5jbGljaygpXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpXG5cbiAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKVxuICAgIH0sXG4gICAgXCJpbWFnZS9wbmdcIixcbiAgICAxXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkRmFjZSgpOiB2b2lkIHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQ2FudmFzRWxlbWVudD4oXG4gICAgXCIjYXZhdGFyLW1lbnUtY29udGFpbmVyIGNhbnZhc1wiXG4gIClcbiAgaWYgKCFjYW52YXMpIHtcbiAgICBjb25zb2xlLndhcm4oXCJDb3VsZG4ndCBmaW5kIHRoZSBndWFyZGlhbidzIGZhY2UuXCIpXG4gICAgcmV0dXJuXG4gIH1cblxuICBkb3dubG9hZENhbnZhcyhjYW52YXMsIFwiZmFjZVwiKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZG93bmxvYWRHdWFyZGlhbigpOiB2b2lkIHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQ2FudmFzRWxlbWVudD4oXG4gICAgXCIjaG9tZS1hdmF0YXItcGxheWVyIGNhbnZhc1wiXG4gIClcbiAgaWYgKCFjYW52YXMpIHtcbiAgICBjb25zb2xlLndhcm4oXCJDb3VsZG4ndCBmaW5kIHRoZSBndWFyZGlhbi5cIilcbiAgICByZXR1cm5cbiAgfVxuXG4gIGRvd25sb2FkQ2FudmFzKGNhbnZhcywgZ2V0TmFtZSgpID8/IFwiZ3VhcmRpYW5cIilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkQXBwZWFyYW5jZSgpOiB2b2lkIHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQ2FudmFzRWxlbWVudD4oXG4gICAgXCIjYXBwZWFyYW5jZS1wcmV2aWV3IGNhbnZhc1wiXG4gIClcbiAgaWYgKCFjYW52YXMpIHtcbiAgICBjb25zb2xlLndhcm4oXCJDb3VsZG4ndCBmaW5kIHRoZSBndWFyZGlhbi5cIilcbiAgICByZXR1cm5cbiAgfVxuXG4gIGRvd25sb2FkQ2FudmFzKGNhbnZhcywgZ2V0TmFtZSgpID8/IFwiZ3VhcmRpYW5cIilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkUHJvZmlsZSgpOiB2b2lkIHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQ2FudmFzRWxlbWVudD4oXG4gICAgXCIucGxheWVyUHJvZmlsZUF2YXRhciBjYW52YXNcIlxuICApXG4gIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSGVhZGluZ0VsZW1lbnQ+KFxuICAgIFwiI21haW4tc2VjdGlvbiAuc2VjdGlvbi10aXRsZVwiXG4gIClcbiAgaWYgKCFjYW52YXMgfHwgIXRpdGxlKSByZXR1cm5cblxuICBkb3dubG9hZENhbnZhcyhjYW52YXMsIHRpdGxlLnRleHRDb250ZW50Py50cmltKCkgPz8gXCJndWFyZGlhblwiKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIChcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2F2YXRhci1tZW51LWNvbnRhaW5lci1vdXRlcj5wXCIpPy50ZXh0Q29udGVudCA/P1xuICAgIG51bGxcbiAgKVxufVxuIiwiZXhwb3J0IGVudW0gRHVyYXRpb25Vbml0IHtcbiAgbWlsbGlzZWNvbmQgPSAxLFxuICBzZWNvbmQgPSAxMDAwICogbWlsbGlzZWNvbmQsXG4gIG1pbnV0ZSA9IDYwICogc2Vjb25kLFxuICBob3VyID0gNjAgKiBtaW51dGUsXG4gIGRheSA9IDI0ICogaG91cixcbiAgd2VlayA9IDcgKiBkYXksXG59XG5cbmV4cG9ydCBjbGFzcyBEdXJhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHZhbHVlOiBudW1iZXIsIHJlYWRvbmx5IHVuaXQ6IER1cmF0aW9uVW5pdCkge31cblxuICBkaXZpZGUoZHVyYXRpb246IER1cmF0aW9uKTogRHVyYXRpb24ge1xuICAgIHJldHVybiBuZXcgRHVyYXRpb24odGhpcy52YWx1ZSAvIGR1cmF0aW9uLnRvKHRoaXMudW5pdCkudmFsdWUsIHRoaXMudW5pdClcbiAgfVxuXG4gIG1pbnVzKGR1cmF0aW9uOiBEdXJhdGlvbik6IER1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IER1cmF0aW9uKHRoaXMudmFsdWUgLSBkdXJhdGlvbi50byh0aGlzLnVuaXQpLnZhbHVlLCB0aGlzLnVuaXQpXG4gIH1cblxuICBtdWx0aXBseShkdXJhdGlvbjogRHVyYXRpb24pOiBEdXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBEdXJhdGlvbih0aGlzLnZhbHVlICogZHVyYXRpb24udG8odGhpcy51bml0KS52YWx1ZSwgdGhpcy51bml0KVxuICB9XG5cbiAgcGx1cyhkdXJhdGlvbjogRHVyYXRpb24pOiBEdXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBEdXJhdGlvbih0aGlzLnZhbHVlICsgZHVyYXRpb24udG8odGhpcy51bml0KS52YWx1ZSwgdGhpcy51bml0KVxuICB9XG5cbiAgdG8odW5pdDogRHVyYXRpb25Vbml0KTogRHVyYXRpb24ge1xuICAgIHJldHVybiBuZXcgRHVyYXRpb24oKHRoaXMudmFsdWUgKiB0aGlzLnVuaXQpIC8gdW5pdCwgdW5pdClcbiAgfVxufVxuIiwiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuaW50ZXJmYWNlIEpRdWVyeVN0YXRpYyB7XG4gIGZsYXZyOiAoZGF0YTogZmxhdnJQYXJhbXMpID0+IHZvaWRcbiAgZmxhdnJOb3RpZjogKFxuICAgIGNvbnRlbnQ6IHN0cmluZyB8IHVua25vd24sXG4gICAgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGlkPzogbnVtYmVyLFxuICAgIGZvcmNlPzogYm9vbGVhblxuICApID0+IHZvaWRcbn1cblxuaW50ZXJmYWNlIGZsYXZyUGFyYW1zIHtcbiAgLyoqIEFuaW1hdGUuY3NzICovXG4gIGFuaW1hdGVDbG9zaW5nPzogXCJmYWRlT3V0XCIgfCBcImZhZGVPdXRVcFwiXG4gIC8qKiBBbmltYXRlLmNzcyAqL1xuICBhbmltYXRlRW50cmFuY2U/OiBcImZhZGVJblwiIHwgXCJmYWRlSW5Eb3duXCJcbiAgLyoqIEJ1dHRvbnMgYXJlIGtleS12YWx1ZSBwYWlycyB3aGVyZSB0aGUga2V5IGlzIHRoZSAgKi9cbiAgYnV0dG9ucz86IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgc3R5bGU/OiBcImNsb3NlXCIgfCBcImRlZmF1bHRcIlxuICAgICAgdGV4dD86IHN0cmluZ1xuICAgICAgYWRkQ2xhc3M/OiBzdHJpbmdcbiAgICAgIC8qKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBwb3B1cCBzaG91bGQgY2xvc2UgKi9cbiAgICAgIGFjdGlvbj86ICgkY29udGFpbmVyOiBKUXVlcnkpID0+IGJvb2xlYW5cbiAgICB9XG4gID5cbiAgLyoqIEhUTUwgY29udGVudCBvZiB0aGUgZmxhdnIgKi9cbiAgY29udGVudD86IHN0cmluZ1xuICAvKiogVHlwZSBvZiBkaWFsb2cuICovXG4gIGRpYWxvZz86IFwiYWxlcnRcIiB8IFwiY29uZmlybVwiIHwgXCJmb3JtXCIgfCBcInByb21wdFwiXG4gIG9uQnVpbGQ/OiAoJGNvbnRhaW5lcjogSlF1ZXJ5KSA9PiB2b2lkXG4gIG9uQ2FuY2VsPzogKCkgPT4gdm9pZFxuICBvbkNvbmZpcm0/OiAoKSA9PiB2b2lkXG4gIG9uU2hvdz86ICgpID0+IHZvaWRcbiAgcHJvbXB0Pzoge1xuICAgIC8qKiBEZWZhdWx0IHZhbHVlICovXG4gICAgdmFsdWU6IHN0cmluZ1xuICB9XG5cbiAgdGl0bGU/OiBzdHJpbmdcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiB0cmltSWNvbihpY29uOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0aWxkZSA9IGljb24ubGFzdEluZGV4T2YoXCJ+XCIpXG4gIGNvbnN0IGRvdCA9IGljb24ubGFzdEluZGV4T2YoXCIuXCIpXG4gIGlmICh0aWxkZSA9PT0gLTEgfHwgZG90ID09PSAtMSkgcmV0dXJuIGljb25cblxuICByZXR1cm4gaWNvbi5zdWJzdHJpbmcoMCwgdGlsZGUpICsgaWNvbi5zdWJzdHJpbmcoZG90KVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUcmFuc2xhdGlvbiB9IGZyb20gXCIuL3RyYW5zbGF0aW9uXCJcblxuZXhwb3J0IGNvbnN0IGVuOiBUcmFuc2xhdGlvbiA9IHtcbiAgaG9tZToge1xuICAgIGZvcnVtOiBcIkZvcnVtXCIsXG4gICAgdGFrZW92ZXI6IFwiVGFrZW92ZXJcIixcbiAgfSxcbiAgdGFrZW92ZXI6IHtcbiAgICBib3VnaHQ6IChuYW1lLCBwcmljZSkgPT5cbiAgICAgIGBCb3VnaHQgPHN0cm9uZz4ke25hbWV9PC9zdHJvbmc+IGZvciA8c3Ryb25nIGNsYXNzPVwicHJpY2UtaXRlbVwiPiR7cHJpY2V9PC9zdHJvbmc+IDxzcGFuIGNsYXNzPVwibWFhbmEtaWNvblwiIGFsdD1cIm1hYW5hc1wiPjwvc3Bhbj4uYCxcbiAgICBkaXNhYmxlZDogXCJUYWtlb3ZlciBtb2RlIGRpc2FibGVkLlwiLFxuICAgIGVuYWJsZWQ6IFwiVGFrZW92ZXIgbW9kZSBlbmFibGVkLiBQbGVhc2UgZG8gbm90IGludGVyYWN0IHdpdGggdGhpcyB0YWIuXCIsXG4gIH0sXG4gIGNhcm91c2VsOiB7XG4gICAgYmVlbW9vdl9hbm5veWFuY2VzOiB7XG4gICAgICB0aXRsZTogXCJCZWVtb292IEFubm95YW5jZXNcIixcbiAgICAgIHN1YnRpdGxlOiBcIkJsb2NrIHNvbWUgb2YgRWxkYXJ5YSdzIGFubm95YW5jZXMuXCIsXG4gICAgfSxcbiAgICBkb3dubG9hZF9mYWNlOiB7XG4gICAgICB0aXRsZTogXCJEb3dubG9hZCB5b3VyIGd1YXJkaWFuJ3MgZmFjZSFcIixcbiAgICAgIHN1YnRpdGxlOiBcIkNsaWNrIGhlcmUgdG8gZG93bmxvYWQgeW91ciBndWFyZGlhbidzIGZhY2UuXCIsXG4gICAgfSxcbiAgICBkb3dubG9hZF9ndWFyZGlhbjoge1xuICAgICAgdGl0bGU6IFwiRG93bmxvYWQgeW91ciBndWFyZGlhbiFcIixcbiAgICAgIHN1YnRpdGxlOiBcIkNsaWNrIGhlcmUgdG8gZG93bmxvYWQgeW91ciBndWFyZGlhbi5cIixcbiAgICB9LFxuICAgIGVsZGFyeWFfZW5oYW5jZW1lbnRzOiB7XG4gICAgICB0aXRsZTogYCR7R00uaW5mby5zY3JpcHQubmFtZX0gdiR7R00uaW5mby5zY3JpcHQudmVyc2lvbn1gLFxuICAgICAgc3VidGl0bGU6IEdNLmluZm8uc2NyaXB0LmRlc2NyaXB0aW9uLFxuICAgIH0sXG4gICAgdGFrZW92ZXI6IHtcbiAgICAgIGRpc2FibGVfdGFrZW92ZXI6IFwiRGlzYWJsZSBUYWtlb3ZlclwiLFxuICAgICAgZW5hYmxlX3Rha2VvdmVyOiBcIkVuYWJsZSBUYWtlb3ZlclwiLFxuICAgICAgc3VidGl0bGU6IFwiR2l2ZSB1cCB0aGlzIHRhYiB0byBwZXJmb3JtIGF1dG9tYXRlZCBhY3Rpb25zLlwiLFxuICAgICAgdGl0bGU6IFwiVGFrZW92ZXJcIixcbiAgICB9LFxuICB9LFxuICBtaW5pZ2FtZXM6IHtcbiAgICBwbGF5ZWRfZm9yOiAobmFtZSwgbWFhbmFzKSA9PlxuICAgICAgYFBsYXllZCA8c3Ryb25nPiR7bmFtZX08L3N0cm9uZz4gZm9yIDxzdHJvbmcgY2xhc3M9XCJwcmljZS1pdGVtXCI+JHttYWFuYXN9PC9zdHJvbmc+IDxzcGFuIGNsYXNzPVwibWFhbmEtaWNvblwiIGFsdD1cIm1hYW5hc1wiPjwvc3Bhbj4gZWFybmVkLmAsXG4gICAgcGxheWVkOiBuYW1lID0+IGBQbGF5ZWQgPHN0cm9uZz4ke25hbWV9PC9zdHJvbmc+LmAsXG4gICAgcGxheWluZzogbmFtZSA9PiBgUGxheWluZyA8c3Ryb25nPiR7bmFtZX08L3N0cm9uZz4uLi5gLFxuICB9LFxuICBhcHBlYXJhbmNlOiB7XG4gICAgYnV0dG9uczoge1xuICAgICAgYmFja3dhcmQ6IFwiTW92ZSBiYWNrXCIsXG4gICAgICBmb3J3YXJkOiBcIkJyaW5nIGZvcndhcmRcIixcbiAgICB9LFxuICAgIGZhdm91cml0ZXM6IHtcbiAgICAgIGltcG9ydGVkOiBcIkltcG9ydGVkIG91dGZpdCFcIixcbiAgICAgIGltcG9ydGluZzogXCJJbXBvcnRpbmcgb3V0Zml0LiBQbGVhc2Ugd2FpdC4uLlwiLFxuICAgICAgY2xpY2tfb3V0Zml0OiB7XG4gICAgICAgIGRlbGV0ZTogXCJEZWxldGVcIixcbiAgICAgICAgZ290b19hY2NvdW50OiBgVG8gdHJhbnNmZXIgeW91ciA8c3Ryb25nPiR7R00uaW5mby5zY3JpcHQubmFtZX08L3N0cm9uZz4gZmF2b3VyaXRlIG91dGZpdHMgdG8gYW5vdGhlciBicm93c2VyLCBleHBvcnQgeW91ciBzZXR0aW5ncyBpbiB0aGUgPGEgaHJlZj1cIi91c2VyL2FjY291bnRcIiBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1wiPm15Jm5ic3A7YWNjb3VudDwvYT4gcGFnZS5gLFxuICAgICAgICBzYXZlZF9sb2NhbGx5OiBgVGFrZSBub3RlIHRoYXQgdGhpcyBvdXRmaXQgaXMgc2F2ZWQgaW4gPHN0cm9uZz4ke0dNLmluZm8uc2NyaXB0Lm5hbWV9PC9zdHJvbmc+JyBzZXR0aW5ncyBhbmQgd2FzIG5vdCBzZW50IHRvIEVsZGFyeWEncyBzZXJ2ZXJzLmAsXG4gICAgICAgIHdlYXI6IFwiV2VhclwiLFxuICAgICAgfSxcbiAgICAgIHNhdmVfb3V0Zml0OiB7XG4gICAgICAgIGdvdG9fYWNjb3VudDogYFRvIHRyYW5zZmVyIHlvdXIgPHN0cm9uZz4ke0dNLmluZm8uc2NyaXB0Lm5hbWV9PC9zdHJvbmc+IGZhdm91cml0ZSBvdXRmaXRzIHRvIGFub3RoZXIgYnJvd3NlciwgZXhwb3J0IHlvdXIgc2V0dGluZ3MgaW4gdGhlIDxhIGhyZWY9XCIvdXNlci9hY2NvdW50XCIgc3R5bGU9XCJ0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcIj5teSZuYnNwO2FjY291bnQ8L2E+IHBhZ2UuYCxcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiTmFtZS4uLlwiLFxuICAgICAgICBzYXZlOiBcIlNhdmVcIixcbiAgICAgICAgc2F2ZWRfbG9jYWxseTogYFRha2Ugbm90ZSB0aGF0IHRoaXMgb3V0Zml0IHdpbGwgb25seSBiZSBzYXZlZCB3aXRoaW4gPHN0cm9uZz4ke0dNLmluZm8uc2NyaXB0Lm5hbWV9PC9zdHJvbmc+JyBzZXR0aW5ncyBhbmQgd2lsbCBub3QgYmUgc2VudCB0byBFbGRhcnlhJ3Mgc2VydmVycy5gLFxuICAgICAgICB0aXRsZTogXCJTYXZlIG91dGZpdFwiLFxuICAgICAgfSxcbiAgICAgIGJ1dHRvbnM6IHtcbiAgICAgICAgZG93bmxvYWQ6IFwiRG93bmxvYWQgUE5HXCIsXG4gICAgICAgIGV4cG9ydDogXCJFeHBvcnRcIixcbiAgICAgICAgaW1wb3J0OiBcIkltcG9ydFwiLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxvYWRlZDogXCJUaGUgd2FyZHJvYmUgaXMgbG9hZGVkLlwiLFxuICAgIGxvYWRpbmc6IChjYXRlZ29yeW5hbWU6IHN0cmluZykgPT5cbiAgICAgIGBMb2FkaW5nIDxzdHJvbmc+JHtjYXRlZ29yeW5hbWV9PC9zdHJvbmc+Li4uYCxcbiAgfSxcbiAgbWFya2V0OiB7XG4gICAgYWRkX3RvX3dpc2hsaXN0OiB7XG4gICAgICBhZGRlZF90b193aXNobGlzdDogKG5hbWUsIHByaWNlKSA9PlxuICAgICAgICBgQWRkZWQgPHN0cm9uZz4ke25hbWV9PC9zdHJvbmc+IGZvciA8c3Ryb25nIGNsYXNzPVwicHJpY2UtaXRlbVwiPiR7cHJpY2V9PC9zdHJvbmc+IDxzcGFuIGNsYXNzPVwibWFhbmEtaWNvblwiIGFsdD1cIm1hYW5hc1wiPjwvc3Bhbj4gdG8gdGhlIHdpc2hsaXN0LmAsXG4gICAgICBpbnZhbGlkX3ByaWNlOiBcIlRoaXMgaXMgbm90IGEgdmFsaWQgcHJpY2UuXCIsXG4gICAgICBzYXZlOiBcIlNhdmVcIixcbiAgICAgIHRleHQ6IFwiSG93IG1hbnkgbWFhbmFzIGRvIHlvdSB3aXNoIHRvIG9mZmVyIHRvIGFjcXVpcmUgdGhpcyBpdGVtP1wiLFxuICAgICAgdGl0bGU6IFwiQWRkIHRvIHdpc2hsaXN0XCIsXG4gICAgfSxcbiAgICBhdWN0aW9uczoge1xuICAgICAgYnV5X25vd19wcmljZTogXCJCdXkgbm93IHByaWNlIDpcIixcbiAgICAgIGN1cnJlbnRfcHJpY2U6IFwiQ3VycmVudCBwcmljZSA6XCIsXG4gICAgICBkZWxldGU6IFwiRGVsZXRlXCIsXG4gICAgICBwdXJjaGFzZV9oaXN0b3J5OiBcIlB1cmNoYXNlIGhpc3RvcnlcIixcbiAgICAgIHNhbGVzX2hpc3Rvcnk6IFwiU2FsZXMgaGlzdG9yeVwiLFxuICAgICAgZGF0ZV90aW1lX2Zvcm1hdDogbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJlbi1HQlwiLCB7XG4gICAgICAgIG1pbnV0ZTogXCIyLWRpZ2l0XCIsXG4gICAgICAgIGhvdXI6IFwiMi1kaWdpdFwiLFxuICAgICAgICBkYXk6IFwibnVtZXJpY1wiLFxuICAgICAgICBtb250aDogXCJsb25nXCIsXG4gICAgICAgIHllYXI6IFwibnVtZXJpY1wiLFxuICAgICAgfSksXG4gICAgfSxcbiAgICBjaGFuZ2VfcHJpY2U6IHtcbiAgICAgIGNoYW5nZWRfcHJpY2U6IChuYW1lLCBwcmljZSkgPT5cbiAgICAgICAgYENoYW5nZWQgPHN0cm9uZz4ke25hbWV9PC9zdHJvbmc+J3MgcHJpY2UgZm9yIDxzdHJvbmcgY2xhc3M9XCJwcmljZS1pdGVtXCI+JHtwcmljZX08L3N0cm9uZz4gPHNwYW4gY2xhc3M9XCJtYWFuYS1pY29uXCIgYWx0PVwibWFhbmFzXCI+PC9zcGFuPi5gLFxuICAgICAgaW52YWxpZF9wcmljZTogXCJUaGlzIGlzIG5vdCBhIHZhbGlkIHByaWNlLlwiLFxuICAgICAgc2F2ZTogXCJTYXZlXCIsXG4gICAgICB0ZXh0OiBcIkhvdyBtYW55IG1hYW5hcyBkbyB5b3Ugd2lzaCB0byBvZmZlciB0byBhY3F1aXJlIHRoaXMgaXRlbT9cIixcbiAgICAgIHRpdGxlOiBcIkNoYW5nZSBwcmljZVwiLFxuICAgIH0sXG4gICAgd2lzaGxpc3Q6IHtcbiAgICAgIGFzc2lzdGFuY2U6IGBPbiB0aGlzIHBhZ2UsIHlvdSBjYW4gb3JnYW5pemUgeW91ciB3aXNobGlzdCBhbmQgY2hlY2sgdGhlIHN0YXR1cyBvZiB5b3VyIHdpc2hlZCBpdGVtcy4gUGxlYXNlIG5vdGUgdGhhdCB5b3VyIHdpc2hsaXN0IGlzIHNhdmVkIGxvY2FsbHkgaW4gPHN0cm9uZz4ke0dNLmluZm8uc2NyaXB0Lm5hbWV9PC9zdHJvbmc+JyBzZXR0aW5ncyBhbmQgaXMgbm90IHNlbnQgdG8gRWxkYXJ5YSdzIHNlcnZlcnMuIFRvIHRyYW5zZmVyIHlvdXIgd2lzaGxpc3QgdG8gYW5vdGhlciBicm93c2VyLCBleHBvcnQgeW91ciBzZXR0aW5ncyBpbiB0aGUgPGEgaHJlZj1cIi91c2VyL2FjY291bnRcIiBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1wiPm15Jm5ic3A7YWNjb3VudDwvYT4gcGFnZS5gLFxuICAgICAgYWN0aW9uczogXCJBY3Rpb25zXCIsXG4gICAgICBjaGFuZ2VfcHJpY2U6IFwiQ2hhbmdlIHByaWNlXCIsXG4gICAgICBkZWxldGVfdG9vbHRpcDogXCJSZW1vdmUgZnJvbSB3aXNobGlzdFwiLFxuICAgICAgZGVsZXRlOiBcIkRlbGV0ZVwiLFxuICAgICAgaWNvbjogXCJJY29uXCIsXG4gICAgICBuYW1lOiBcIk5hbWVcIixcbiAgICAgIHByaWNlOiBcIlByaWNlXCIsXG4gICAgICByZXNldF90b29sdGlwOiBcIlJlc2V0IHRoZSBlcnJvciBzdGF0dXNcIixcbiAgICAgIHJlc2V0OiBcIlJlc2V0XCIsXG4gICAgICBzdGF0dXM6IFwiU3RhdHVzXCIsXG4gICAgICB0aXRsZTogXCJXaXNobGlzdFwiLFxuICAgIH0sXG4gIH0sXG4gIGFjY291bnQ6IHtcbiAgICBkZWJ1Z190b29sdGlwOiBcIkVuYWJsZXMgb3IgZGlzYWJsZXMgbG9nZ2luZy5cIixcbiAgICBkZWJ1ZzogXCJEZWJ1Z1wiLFxuICAgIGVuaGFuY2VtZW50czogXCJFbmhhbmNlbWVudHNcIixcbiAgICBleHBsb3JhdGlvbnM6IFwiRXhwbG9yYXRpb25zXCIsXG4gICAgZXhwb3J0OiBcIkV4cG9ydCBzZXR0aW5nc1wiLFxuICAgIGltcG9ydDogXCJJbXBvcnQgc2V0dGluZ3NcIixcbiAgICBpbXBvcnRlZDogXCJJbXBvcnRlZCBzZXR0aW5ncyFcIixcbiAgICBtYXJrZXQ6IFwiTWFya2V0XCIsXG4gICAgbWluaWdhbWVzOiBcIk1pbmlnYW1lc1wiLFxuICB9LFxuICBwZXQ6IHtcbiAgICBhdXRvX2V4cGxvcmU6IFwiSGlnaGxpZ2h0XCIsXG4gICAgZGF0ZV90aW1lX2Zvcm1hdDogbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJlbi1HQlwiLCB7XG4gICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgICBkYXk6IFwibnVtZXJpY1wiLFxuICAgICAgbW9udGg6IFwibG9uZ1wiLFxuICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgfSksXG4gICAgZGVsZXRlX2hpc3Rvcnk6IFwiRGVsZXRlIGhpc3RvcnlcIixcbiAgICBlbXB0eV9oaXN0b3J5OlxuICAgICAgXCJZb3VyIGV4cGxvcmF0aW9uIGhpc3RvcnkgaXMgZW1wdHkuIEl0IHdpbGwgYXV0b21hdGljYWxseSBmaWxsIHVwIGFzIHlvdXIgZmFtaWxpYXIgZmluZHMgaXRlbXMgd2hpbGUgZXhwbG9yaW5nLlwiLFxuICAgIGdvdG9fYWNjb3VudDogYFRvIHRyYW5zZmVyIHlvdXIgZXhwbG9yYXRpb24gaGlzdG9yeSB0byBhbm90aGVyIGJyb3dzZXIsIGV4cG9ydCB5b3VyIHNldHRpbmdzIGZyb20gdGhlIDxlbT5teSZuYnNwO2FjY291bnQ8L2VtPiBwYWdlLmAsXG4gICAgaGlzdG9yeTogXCJIaXN0b3J5XCIsXG4gICAgc2F2ZWRfbG9jYWxseTogYFBsZWFzZSBub3RlIHRoYXQgeW91ciBleHBsb3JhdGlvbiBoaXN0b3J5IGlzIHNhdmVkIGxvY2FsbHkgaW4gPHN0cm9uZz4ke0dNLmluZm8uc2NyaXB0Lm5hbWV9PC9zdHJvbmc+JyBzZXR0aW5ncyBhbmQgd2FzIG5vdCBzZW50IHRvIEVsZGFyeWEncyBzZXJ2ZXJzLmAsXG4gIH0sXG4gIHByb2ZpbGU6IHtcbiAgICBleHBvcnRfb3V0Zml0OiBcIkV4cG9ydCBvdXRmaXRcIixcbiAgICBkb3dubG9hZF9vdXRmaXQ6IFwiRG93bmxvYWQgUE5HXCIsXG4gIH0sXG4gIGVycm9yOiB7XG4gICAgZG93bmxvYWRDYW52YXM6IFwiVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBpbWFnZS5cIixcbiAgfSxcbiAgbWFsbDoge1xuICAgIGFkZF90b193aXNobGlzdDoge1xuICAgICAgdGl0bGU6IFwiQWRkIHRvIG1hcmtldCB3aXNobGlzdFwiLFxuICAgICAgdGV4dDogXCJIb3cgbWFueSBtYWFuYXMgZG8geW91IHdpc2ggdG8gb2ZmZXIgdG8gYWNxdWlyZSB0aGlzIGl0ZW0/XCIsXG4gICAgICBub3RlOiBcIlBsZWFzZSBub3RlIHRoYXQgdGhlIGl0ZW1zIGFkZGVkIGZyb20gdGhlIG1hbGwgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYXZhaWxhYmxlIGF0IHRoZSBtYXJrZXQuXCIsXG4gICAgfSxcbiAgfSxcbn1cblxuT2JqZWN0LmZyZWV6ZShlbilcbiIsImltcG9ydCB0eXBlIHsgVHJhbnNsYXRpb24gfSBmcm9tIFwiLi90cmFuc2xhdGlvblwiXG5cbmV4cG9ydCBjb25zdCBmcjogVHJhbnNsYXRpb24gPSB7XG4gIGhvbWU6IHtcbiAgICBmb3J1bTogXCJGb3J1bVwiLFxuICAgIHRha2VvdmVyOiBcIlRha2VvdmVyXCIsXG4gIH0sXG4gIHRha2VvdmVyOiB7XG4gICAgYm91Z2h0OiAobmFtZSwgcHJpY2UpID0+XG4gICAgICBgQWNoZXTDqSA8c3Ryb25nPiR7bmFtZX08L3N0cm9uZz4gcG91ciA8c3Ryb25nIGNsYXNzPVwicHJpY2UtaXRlbVwiPiR7cHJpY2V9PC9zdHJvbmc+IDxzcGFuIGNsYXNzPVwibWFhbmEtaWNvblwiIGFsdD1cIm1hYW5hc1wiPjwvc3Bhbj4uYCxcbiAgICBkaXNhYmxlZDogXCJUYWtlb3ZlciBkw6lzYWN0aXbDqS5cIixcbiAgICBlbmFibGVkOiBcIlRha2VvdmVyIGFjdGl2w6kuIMOJdml0ZSBkJ2ludMOpcmFnaXIgYXZlYyBjZXQgb25nbGV0LlwiLFxuICB9LFxuICBjYXJvdXNlbDoge1xuICAgIGJlZW1vb3ZfYW5ub3lhbmNlczoge1xuICAgICAgdGl0bGU6IFwiQmVlbW9vdiBBbm5veWFuY2VzXCIsXG4gICAgICBzdWJ0aXRsZTogXCJCbG9xdWUgY2VydGFpbnMgaXJyaXRhbnRzIGQnRWxkYXJ5YS5cIixcbiAgICB9LFxuICAgIGRvd25sb2FkX2ZhY2U6IHtcbiAgICAgIHRpdGxlOiBcIlTDqWzDqWNoYXJnZSBsZSB2aXNhZ2UgZGUgdGEgZ2FyZGllbm5lIVwiLFxuICAgICAgc3VidGl0bGU6IFwiQ2xpcXVlIGljaSBwb3VyIHTDqWzDqWNoYXJnZXIgbGUgdmlzYWdlIGRlIHRhIGdhcmRpZW5uZS5cIixcbiAgICB9LFxuICAgIGRvd25sb2FkX2d1YXJkaWFuOiB7XG4gICAgICB0aXRsZTogXCJUw6lsw6ljaGFyZ2UgdGEgZ2FyZGllbm5lIVwiLFxuICAgICAgc3VidGl0bGU6IFwiQ2xpcXVlIGljaSBwb3VyIHTDqWzDqWNoYXJnZXIgdGEgZ2FyZGllbm5lLlwiLFxuICAgIH0sXG4gICAgZWxkYXJ5YV9lbmhhbmNlbWVudHM6IHtcbiAgICAgIHRpdGxlOiBgJHtHTS5pbmZvLnNjcmlwdC5uYW1lfSB2JHtHTS5pbmZvLnNjcmlwdC52ZXJzaW9ufWAsXG4gICAgICBzdWJ0aXRsZTogXCJBbcOpbGlvcmUgbCdleHDDqXJpZW5jZSB1dGlsaXNhdGV1ciBkJ0VsZGFyeWEuXCIsXG4gICAgfSxcbiAgICB0YWtlb3Zlcjoge1xuICAgICAgZGlzYWJsZV90YWtlb3ZlcjogXCJEw6lzYWN0aXZlIGxlIHRha2VvdmVyXCIsXG4gICAgICBlbmFibGVfdGFrZW92ZXI6IFwiQWN0aXZlIGxlIHRha2VvdmVyXCIsXG4gICAgICBzdWJ0aXRsZTogXCJMYWlzc2UgY2V0IG9uZ2xldCBwZXJmb3JtZXIgZGVzIGFjdGlvbnMgYXV0b21hdGlxdWVzLlwiLFxuICAgICAgdGl0bGU6IFwiVGFrZW92ZXJcIixcbiAgICB9LFxuICB9LFxuICBtaW5pZ2FtZXM6IHtcbiAgICBwbGF5ZWRfZm9yOiAobmFtZTogc3RyaW5nLCBtYWFuYXM6IG51bWJlcikgPT5cbiAgICAgIGBBIGpvdcOpIMOgIDxzdHJvbmc+JHtuYW1lfTwvc3Ryb25nPiBwb3VyIDxzdHJvbmcgY2xhc3M9XCJwcmljZS1pdGVtXCI+JHttYWFuYXN9PC9zdHJvbmc+IDxzcGFuIGNsYXNzPVwibWFhbmEtaWNvblwiIGFsdD1cIm1hYW5hc1wiPjwvc3Bhbj4gZ2FnbsOpcy5gLFxuICAgIHBsYXllZDogKG5hbWU6IHN0cmluZykgPT4gYEEgam91w6kgw6AgPHN0cm9uZz4ke25hbWV9PC9zdHJvbmc+LmAsXG4gICAgcGxheWluZzogKG5hbWU6IHN0cmluZykgPT4gYEpvdWUgw6AgPHN0cm9uZz4ke25hbWV9PC9zdHJvbmc+Li4uYCxcbiAgfSxcbiAgYXBwZWFyYW5jZToge1xuICAgIGJ1dHRvbnM6IHtcbiAgICAgIGJhY2t3YXJkOiBcIlZlcnMgbCdhcnJpw6hyZVwiLFxuICAgICAgZm9yd2FyZDogXCJWZXJzIGwnYXZhbnRcIixcbiAgICB9LFxuICAgIGZhdm91cml0ZXM6IHtcbiAgICAgIGltcG9ydGVkOiBcIkltcG9ydGF0aW9uIHLDqXVzc2llIVwiLFxuICAgICAgaW1wb3J0aW5nOiBcIkltcG9ydGF0aW9uIGVuIGNvdXJzLi4uXCIsXG4gICAgICBjbGlja19vdXRmaXQ6IHtcbiAgICAgICAgZGVsZXRlOiBcIlN1cHByaW1lclwiLFxuICAgICAgICBnb3RvX2FjY291bnQ6IGBQb3VyIHRyYW5zZsOpcmVyIHRlcyB0ZW51ZXMgZmF2b3JpdGVzIGQnPHN0cm9uZz4ke0dNLmluZm8uc2NyaXB0Lm5hbWV9PC9zdHJvbmc+IHZlcnMgdW4gYXV0cmUgbmF2aWdhdGV1ciwgZXhwb3J0ZSB0ZXMgcGFyYW3DqHRyZXMgw6AgcGFydGlyIGRlIGxhIHBhZ2UgPGEgaHJlZj1cIi91c2VyL2FjY291bnRcIiBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1wiPm1vbiZuYnNwO2NvbXB0ZTwvYT4uYCxcbiAgICAgICAgc2F2ZWRfbG9jYWxseTogYFByZW5kcyBub3RlIHF1ZSBjZXR0ZSB0ZW51ZSBlc3Qgc2F1dmVnYXJkw6llIGxvY2FsZW1lbnQgZGFucyBsZXMgcGFyYW3DqHRyZXMgZCc8c3Ryb25nPiR7R00uaW5mby5zY3JpcHQubmFtZX08L3N0cm9uZz4gZXQgbidhIHBhcyDDqXTDqSBlbnZvecOpZSBhdXggc2VydmV1cnMgZCdFbGRhcnlhLmAsXG4gICAgICAgIHdlYXI6IFwiUG9ydGVyXCIsXG4gICAgICB9LFxuICAgICAgc2F2ZV9vdXRmaXQ6IHtcbiAgICAgICAgZ290b19hY2NvdW50OiBgUG91ciB0cmFuc2bDqXJlciB0ZXMgdGVudWVzIGZhdm9yaXRlcyBkJzxzdHJvbmc+JHtHTS5pbmZvLnNjcmlwdC5uYW1lfTwvc3Ryb25nPiB2ZXJzIHVuIGF1dHJlIG5hdmlnYXRldXIsIGV4cG9ydGUgdGVzIHBhcmFtw6h0cmVzIMOgIHBhcnRpciBkZSBsYSBwYWdlIDxhIGhyZWY9XCIvdXNlci9hY2NvdW50XCIgc3R5bGU9XCJ0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcIj5tb24mbmJzcDtjb21wdGU8L2E+LmAsXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIk5vbS4uLlwiLFxuICAgICAgICBzYXZlOiBcIlNhdXZlZ2FyZGVyXCIsXG4gICAgICAgIHNhdmVkX2xvY2FsbHk6IGBQcmVuZHMgbm90ZSBxdWUgY2V0dGUgdGVudWUgc2VyYSBzYXV2ZWdhcmTDqWUgbG9jYWxlbWVudCBkYW5zIGxlcyBwYXJhbcOodHJlcyBkJzxzdHJvbmc+JHtHTS5pbmZvLnNjcmlwdC5uYW1lfTwvc3Ryb25nPiBldCBuZSBzZXJhIHBhcyBlbnZvecOpZSBhdXggc2VydmV1cnMgZCdFbGRhcnlhLmAsXG4gICAgICAgIHRpdGxlOiBcIlNhdXZlZ2FyZGVyIGNldHRlIHRlbnVlXCIsXG4gICAgICB9LFxuICAgICAgYnV0dG9uczoge1xuICAgICAgICBkb3dubG9hZDogXCJUw6lsw6ljaGFyZ2VyIGxlIFBOR1wiLFxuICAgICAgICBleHBvcnQ6IFwiRXhwb3J0ZXJcIixcbiAgICAgICAgaW1wb3J0OiBcIkltcG9ydGVyXCIsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbG9hZGVkOiBcIkxlIGNoYXJnZW1lbnQgZGUgbGEgZ2FyZGUtcm9iZSBlc3QgdGVybWluw6kuXCIsXG4gICAgbG9hZGluZzogKGNhdGVnb3J5bmFtZTogc3RyaW5nKSA9PlxuICAgICAgYENoYXJnZW1lbnQgZGUgPHN0cm9uZz4ke2NhdGVnb3J5bmFtZX08L3N0cm9uZz4uLi5gLFxuICB9LFxuICBtYXJrZXQ6IHtcbiAgICBhZGRfdG9fd2lzaGxpc3Q6IHtcbiAgICAgIGFkZGVkX3RvX3dpc2hsaXN0OiAobmFtZTogc3RyaW5nLCBwcmljZTogbnVtYmVyKSA9PlxuICAgICAgICBgQWpvdXTDqSA8c3Ryb25nPiR7bmFtZX08L3N0cm9uZz4gcG91ciA8c3Ryb25nIGNsYXNzPVwicHJpY2UtaXRlbVwiPiR7cHJpY2V9PC9zdHJvbmc+IDxzcGFuIGNsYXNzPVwibWFhbmEtaWNvblwiIGFsdD1cIm1hYW5hc1wiPjwvc3Bhbj4gw6AgbGEgbGlzdGUgZGUgc291aGFpdHMuYCxcbiAgICAgIGludmFsaWRfcHJpY2U6IFwiQ2UgcHJpeCBuJ2VzdCBwYXMgdmFsaWRlLlwiLFxuICAgICAgc2F2ZTogXCJTYXV2ZWdhcmRlclwiLFxuICAgICAgdGV4dDogXCJDb21iaWVuIGRlIG1hYW5hcyBzb3VoYWl0ZXMtdHUgb2ZmcmlyIHBvdXIgYWNxdcOpcmlyIGNldCBpdGVtP1wiLFxuICAgICAgdGl0bGU6IFwiQWpvdXRlciDDoCBsYSBsaXN0ZSBkZSBzb3VoYWl0XCIsXG4gICAgfSxcbiAgICBhdWN0aW9uczoge1xuICAgICAgYnV5X25vd19wcmljZTogXCJBY2hhdCBpbW3DqWRpYXQgOlwiLFxuICAgICAgY3VycmVudF9wcmljZTogXCJNaXNlIGFjdHVlbGxlIDpcIixcbiAgICAgIGRlbGV0ZTogXCJTdXBwcmltZXJcIixcbiAgICAgIHB1cmNoYXNlX2hpc3Rvcnk6IFwiSGlzdG9yaXF1ZSBkJ2FjaGF0XCIsXG4gICAgICBzYWxlc19oaXN0b3J5OiBcIkhpc3RvcmlxdWUgZGUgdmVudGVcIixcbiAgICAgIGRhdGVfdGltZV9mb3JtYXQ6IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZnItQ0FcIiwge1xuICAgICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgICAgICBob3VyOiBcIjItZGlnaXRcIixcbiAgICAgICAgZGF5OiBcIm51bWVyaWNcIixcbiAgICAgICAgbW9udGg6IFwibG9uZ1wiLFxuICAgICAgICB5ZWFyOiBcIm51bWVyaWNcIixcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgY2hhbmdlX3ByaWNlOiB7XG4gICAgICBjaGFuZ2VkX3ByaWNlOiAobmFtZTogc3RyaW5nLCBwcmljZTogbnVtYmVyKSA9PlxuICAgICAgICBgQ2hhbmfDqSBsZSBwcml4IGRlIDxzdHJvbmc+JHtuYW1lfTwvc3Ryb25nPiBwb3VyIDxzdHJvbmcgY2xhc3M9XCJwcmljZS1pdGVtXCI+JHtwcmljZX08L3N0cm9uZz4gPHNwYW4gY2xhc3M9XCJtYWFuYS1pY29uXCIgYWx0PVwibWFhbmFzXCI+PC9zcGFuPi5gLFxuICAgICAgaW52YWxpZF9wcmljZTogXCJDZSBwcml4IG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgICBzYXZlOiBcIlNhdXZlZ2FyZGVyXCIsXG4gICAgICB0ZXh0OiBcIkNvbWJpZW4gZGUgbWFhbmFzIHNvdWhhaXRlcy10dSBvZmZyaXIgcG91ciBhY3F1w6lyaXIgY2V0IGl0ZW0/XCIsXG4gICAgICB0aXRsZTogXCJDaGFuZ2VyIGxlIHByaXhcIixcbiAgICB9LFxuICAgIHdpc2hsaXN0OiB7XG4gICAgICBhc3Npc3RhbmNlOiBgU3VyIGNldHRlIHBhZ2UsIHR1IHBldXggb3JnYW5pc2VyIHRhIGxpc3RlIGRlIHNvdWhhaXRzIGV0IHbDqXJpZmllciBsZSBzdGF0dXQgZGUgdGVzIGFydGljbGVzIHNvdWhhaXTDqXMuIFByZW5kcyBub3RlIHF1ZSB0YSBsaXN0ZSBkZSBzb3VoYWl0cyBlc3Qgc2F1dmVnYXJkw6llIGxvY2FsZW1lbnQgZGFucyBsZXMgcGFyYW3DqHRyZXMgZCc8c3Ryb25nPiR7R00uaW5mby5zY3JpcHQubmFtZX08L3N0cm9uZz4gZXQgbidlc3QgcGFzIGVudm95w6llIGF1eCBzZXJ2ZXVycyBkJ0VsZGFyeWEuIFBvdXIgdHJhbnNmw6lyZXIgdGEgbGlzdGUgZGUgc291aGFpdHMgdmVycyB1biBhdXRyZSBuYXZpZ2F0ZXVyLCBleHBvcnRlLWxhIMOgIHBhcnRpciBkZSBsYSBwYWdlIDxhIGhyZWY9XCIvdXNlci9hY2NvdW50XCIgc3R5bGU9XCJ0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcIj5tb24mbmJzcDtjb21wdGU8L2E+LmAsXG4gICAgICBhY3Rpb25zOiBcIkFjdGlvbnNcIixcbiAgICAgIGNoYW5nZV9wcmljZTogXCJDaGFuZ2VyIGxlIHByaXhcIixcbiAgICAgIGRlbGV0ZV90b29sdGlwOiBcIlJldGlyZXIgZGUgbGEgbGlzdGUgZGUgc291aGFpdHNcIixcbiAgICAgIGRlbGV0ZTogXCJTdXBwcmltZXJcIixcbiAgICAgIGljb246IFwiSWPDtG5lXCIsXG4gICAgICBuYW1lOiBcIk5vbVwiLFxuICAgICAgcHJpY2U6IFwiUHJpeFwiLFxuICAgICAgcmVzZXRfdG9vbHRpcDogXCJSw6lpbml0aWFsaXNlciBsJ8OpdGF0IGQnZXJyZXVyXCIsXG4gICAgICByZXNldDogXCJSw6lpbml0aWFsaXNlclwiLFxuICAgICAgc3RhdHVzOiBcIlN0YXR1dFwiLFxuICAgICAgdGl0bGU6IFwiTGlzdGUgZGUgc291aGFpdHNcIixcbiAgICB9LFxuICB9LFxuICBhY2NvdW50OiB7XG4gICAgZGVidWdfdG9vbHRpcDogXCJBY3RpdmUgb3UgZMOpc2FjdGl2ZSBsYSBqb3VybmFsaXNhdGlvbi5cIixcbiAgICBkZWJ1ZzogXCJEw6lib2dhZ2VcIixcbiAgICBlbmhhbmNlbWVudHM6IFwiQW3DqWxpb3JhdGlvbnNcIixcbiAgICBleHBsb3JhdGlvbnM6IFwiRXhwbG9yYXRpb25zXCIsXG4gICAgZXhwb3J0OiBcIkV4cG9ydGVyIGxlcyBwYXJhbcOodHJlc1wiLFxuICAgIGltcG9ydDogXCJJbXBvcnRlciBsZXMgcGFyYW3DqHRyZXNcIixcbiAgICBpbXBvcnRlZDogXCJQYXJhbcOodHJlcyBpbXBvcnTDqXNcIixcbiAgICBtYXJrZXQ6IFwiTWFyY2jDqVwiLFxuICAgIG1pbmlnYW1lczogXCJNaW5pLWpldXhcIixcbiAgfSxcbiAgcGV0OiB7XG4gICAgYXV0b19leHBsb3JlOiBcIk1hcnF1ZXJcIixcbiAgICBkYXRlX3RpbWVfZm9ybWF0OiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImZyLUNBXCIsIHtcbiAgICAgIG1pbnV0ZTogXCIyLWRpZ2l0XCIsXG4gICAgICBob3VyOiBcIjItZGlnaXRcIixcbiAgICAgIGRheTogXCJudW1lcmljXCIsXG4gICAgICBtb250aDogXCJsb25nXCIsXG4gICAgICB5ZWFyOiBcIm51bWVyaWNcIixcbiAgICB9KSxcbiAgICBkZWxldGVfaGlzdG9yeTogXCJOZXR0b3llciBsJ2hpc3RvcmlxdWVcIixcbiAgICBlbXB0eV9oaXN0b3J5OlxuICAgICAgXCJUb24gaGlzdG9yaXF1ZSBkJ2V4cGxvcmF0aW9uIGVzdCB2aWRlLiBJbCBzZSByZW1wbGlyYSBhdXRvbWF0aXF1ZW1lbnQgw6AgbWVzdXJlIHF1ZSB0b24gZmFtaWxpZXIgdHJvdXZlcmEgZGVzIGl0ZW1zIGVuIGV4cGxvcmF0aW9uLlwiLFxuICAgIGdvdG9fYWNjb3VudDpcbiAgICAgIFwiUG91ciB0cmFuc2bDqXJlciB0b24gaGlzdG9yaXF1ZSBkJ2V4cGxvcmF0aW9ucyB2ZXJzIHVuIGF1dHJlIG5hdmlnYXRldXIsIGV4cG9ydGUgdGVzIHBhcmFtw6h0cmVzIMOgIHBhcnRpciBkZSBsYSBwYWdlIDxlbT5tb24gY29tcHRlPC9lbT4uXCIsXG4gICAgaGlzdG9yeTogXCJIaXN0b3JpcXVlXCIsXG4gICAgc2F2ZWRfbG9jYWxseTogYFByZW5kcyBub3RlIHF1ZSB0b24gaGlzdG9yaXF1ZSBkJ2V4cGxvcmF0aW9ucyBlc3Qgc2F1dmVnYXJkw6kgbG9jYWxlbWVudCBkYW5zIGxlcyBwYXJhbcOodHJlcyBkJzxzdHJvbmc+JHtHTS5pbmZvLnNjcmlwdC5uYW1lfTwvc3Ryb25nPiBldCBuJ2EgcGFzIMOpdMOpIGVudm95w6kgYXV4IHNlcnZldXJzIGQnRWxkYXJ5YS5gLFxuICB9LFxuICBwcm9maWxlOiB7XG4gICAgZXhwb3J0X291dGZpdDogXCJFeHBvcnRlciBsYSB0ZW51ZVwiLFxuICAgIGRvd25sb2FkX291dGZpdDogXCJUw6lsw6ljaGFyZ2VyIGxlIFBOR1wiLFxuICB9LFxuICBlcnJvcjoge1xuICAgIGRvd25sb2FkQ2FudmFzOlxuICAgICAgXCJVbmUgZXJyZXVyIGVzdCBzdXJ2ZW51ZSBsb3JzIGR1IHTDqWzDqWNoYXJnZW1lbnQgZGUgbCdpbWFnZS5cIixcbiAgfSxcbiAgbWFsbDoge1xuICAgIGFkZF90b193aXNobGlzdDoge1xuICAgICAgdGl0bGU6IFwiQWpvdXRlciDDoCBsYSBsaXN0ZSBkZSBzb3VoYWl0IGR1IG1hcmNow6lcIixcbiAgICAgIHRleHQ6IFwiQ29tYmllbiBkZSBtYWFuYXMgc291aGFpdGVzLXR1IG9mZnJpciBwb3VyIGFjcXXDqXJpciBjZXQgaXRlbT9cIixcbiAgICAgIG5vdGU6IFwiUHJlbmRzIG5vdGUgcXVlIGxlcyBpdGVtcyBham91dMOpcyDDoCBwYXJ0aXIgZGUgbGEgYm91dGlxdWUgbmUgc2Vyb250IHBhcyBuw6ljZXNzYWlyZW1lbnQgZGlzcG9uaWJsZXMgYXUgbWFyY2jDqS5cIixcbiAgICB9LFxuICB9LFxufVxuXG5PYmplY3QuZnJlZXplKGZyKVxuIiwiaW1wb3J0IHsgZW4gfSBmcm9tIFwiLi9lblwiXG5pbXBvcnQgeyBmciB9IGZyb20gXCIuL2ZyXCJcbmltcG9ydCB0eXBlIHsgVHJhbnNsYXRpb24gfSBmcm9tIFwiLi90cmFuc2xhdGlvblwiXG5cbmZ1bmN0aW9uIHRyYW5zbGF0aW9uKCk6IFRyYW5zbGF0aW9uIHtcbiAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lLmVuZHNXaXRoKFwiLmNvbS5iclwiKSkgcmV0dXJuIGVuXG4gIGlmIChsb2NhdGlvbi5ob3N0bmFtZS5lbmRzV2l0aChcIi5kZVwiKSkgcmV0dXJuIGVuXG4gIGlmIChsb2NhdGlvbi5ob3N0bmFtZS5lbmRzV2l0aChcIi5lc1wiKSkgcmV0dXJuIGVuXG4gIGlmIChsb2NhdGlvbi5ob3N0bmFtZS5lbmRzV2l0aChcIi5odVwiKSkgcmV0dXJuIGVuXG4gIGlmIChsb2NhdGlvbi5ob3N0bmFtZS5lbmRzV2l0aChcIi5pdFwiKSkgcmV0dXJuIGVuXG4gIGlmIChsb2NhdGlvbi5ob3N0bmFtZS5lbmRzV2l0aChcIi5wbFwiKSkgcmV0dXJuIGVuXG4gIGlmIChsb2NhdGlvbi5ob3N0bmFtZS5lbmRzV2l0aChcIi5ydVwiKSkgcmV0dXJuIGVuXG4gIGlmIChsb2NhdGlvbi5ob3N0bmFtZS5lbmRzV2l0aChcIi5jb21cIikpIHJldHVybiBlblxuICBpZiAobG9jYXRpb24uaG9zdG5hbWUuZW5kc1dpdGgoXCIuZnJcIikpIHJldHVybiBmclxuICBlbHNlIHJldHVybiBlblxufVxuXG5leHBvcnQgY29uc3QgdHJhbnNsYXRlID0gdHJhbnNsYXRpb24oKVxuIiwiZXhwb3J0IGVudW0gRGF0YWJhc2VzIHtcbiAgZWxkYXJ5YV9lbmhhbmNlbWVudHMgPSBcImVsZGFyeWFfZW5oYW5jZW1lbnRzXCIsXG59XG4iLCJleHBvcnQgZW51bSBGaWVsZHMge1xuICBibG9iID0gXCJibG9iXCIsXG4gIGlkID0gXCJpZFwiLFxuICBpdGVtcyA9IFwiaXRlbXNcIixcbiAgbmFtZSA9IFwibmFtZVwiLFxufVxuIiwiaW1wb3J0IHR5cGUgeyBGYXZvdXJpdGVPdXRmaXQgfSBmcm9tIFwiLi4vYXBwZWFyYW5jZS9pbnRlcmZhY2VzL2Zhdm91cml0ZV9vdXRmaXRcIlxuaW1wb3J0IHsgRGF0YWJhc2VzIH0gZnJvbSBcIi4vZGF0YWJhc2VzLmVudW1cIlxuaW1wb3J0IHsgRmllbGRzIH0gZnJvbSBcIi4vZmllbGRzLmVudW1cIlxuaW1wb3J0IHsgVGFibGVzIH0gZnJvbSBcIi4vdGFibGVzLmVudW1cIlxuXG5jbGFzcyBJbmRleGVkREIge1xuICBwcml2YXRlIGRiPzogSURCRGF0YWJhc2VcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4oRGF0YWJhc2VzLmVsZGFyeWFfZW5oYW5jZW1lbnRzLCAxKVxuICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCk6IElEQkRhdGFiYXNlID0+ICh0aGlzLmRiID0gcmVxdWVzdC5yZXN1bHQpXG4gICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSBmdW5jdGlvbiAodGhpczogSURCT3BlbkRCUmVxdWVzdCk6IHZvaWQge1xuICAgICAgY29uc3QgZGI6IElEQkRhdGFiYXNlID0gdGhpcy5yZXN1bHRcblxuICAgICAgY29uc3Qgb2JqZWN0U3RvcmUgPSBkYi5jcmVhdGVPYmplY3RTdG9yZShUYWJsZXMuZmF2b3VyaXRlX291dGZpdHMsIHtcbiAgICAgICAga2V5UGF0aDogXCJpZFwiLFxuICAgICAgICBhdXRvSW5jcmVtZW50OiB0cnVlLFxuICAgICAgfSlcblxuICAgICAgb2JqZWN0U3RvcmUuY3JlYXRlSW5kZXgoRmllbGRzLmJsb2IsIFwiYmxvYlwiLCB7IHVuaXF1ZTogZmFsc2UgfSlcbiAgICAgIG9iamVjdFN0b3JlLmNyZWF0ZUluZGV4KEZpZWxkcy5pdGVtcywgXCJpdGVtc1wiLCB7IHVuaXF1ZTogZmFsc2UgfSlcbiAgICAgIG9iamVjdFN0b3JlLmNyZWF0ZUluZGV4KEZpZWxkcy5uYW1lLCBcIm5hbWVcIiwgeyB1bmlxdWU6IGZhbHNlIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIGEgbmV3IGBGYXZvdXJpdGVPdXRmaXRgIHdpdGggdGhlIGBrZXlgIHByb3BlcnR5IHNldC4gKi9cbiAgYXN5bmMgYWRkRmF2b3VyaXRlT3V0Zml0KFxuICAgIGZhdm91cml0ZTogRmF2b3VyaXRlT3V0Zml0XG4gICk6IFByb21pc2U8RmF2b3VyaXRlT3V0Zml0PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIGlmICghdGhpcy5kYikgcmV0dXJuIHZvaWQgcmVqZWN0KClcblxuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZGJcbiAgICAgICAgLnRyYW5zYWN0aW9uKFtUYWJsZXMuZmF2b3VyaXRlX291dGZpdHNdLCBcInJlYWR3cml0ZVwiKVxuICAgICAgICAub2JqZWN0U3RvcmUoVGFibGVzLmZhdm91cml0ZV9vdXRmaXRzKVxuICAgICAgICAuYWRkKGZhdm91cml0ZSlcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKTogdm9pZCA9PlxuICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAuLi5mYXZvdXJpdGUsXG4gICAgICAgICAgdXJsOiBmYXZvdXJpdGUudXJsID8/IFVSTC5jcmVhdGVPYmplY3RVUkwoZmF2b3VyaXRlLmJsb2IpLFxuICAgICAgICAgIGlkOiBOdW1iZXIocmVxdWVzdC5yZXN1bHQpLFxuICAgICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBjbGVhckZhdm91cml0ZU91dGZpdHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIGlmICghdGhpcy5kYikgcmV0dXJuIHZvaWQgcmVqZWN0KClcblxuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZGJcbiAgICAgICAgLnRyYW5zYWN0aW9uKFtUYWJsZXMuZmF2b3VyaXRlX291dGZpdHNdLCBcInJlYWR3cml0ZVwiKVxuICAgICAgICAub2JqZWN0U3RvcmUoVGFibGVzLmZhdm91cml0ZV9vdXRmaXRzKVxuICAgICAgICAuY2xlYXIoKVxuXG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpOiB2b2lkID0+IHJlc29sdmUoKVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBkZWxldGVGYXZvdXJpdGVPdXRmaXQoZmF2b3VyaXRlOiBGYXZvdXJpdGVPdXRmaXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCF0aGlzLmRiKSByZXR1cm4gdm9pZCByZWplY3QoKVxuXG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5kYlxuICAgICAgICAudHJhbnNhY3Rpb24oW1RhYmxlcy5mYXZvdXJpdGVfb3V0Zml0c10sIFwicmVhZHdyaXRlXCIpXG4gICAgICAgIC5vYmplY3RTdG9yZShUYWJsZXMuZmF2b3VyaXRlX291dGZpdHMpXG4gICAgICAgIC5kZWxldGUoZmF2b3VyaXRlLmlkISlcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgICBpZiAoZmF2b3VyaXRlLnVybCkgVVJMLnJldm9rZU9iamVjdFVSTChmYXZvdXJpdGUudXJsKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBnZXRGYXZvdXJpdGVPdXRmaXQoaWQ6IG51bWJlcik6IFByb21pc2U8RmF2b3VyaXRlT3V0Zml0PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIGlmICghdGhpcy5kYikgcmV0dXJuIHZvaWQgcmVqZWN0KClcblxuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZGJcbiAgICAgICAgLnRyYW5zYWN0aW9uKFtUYWJsZXMuZmF2b3VyaXRlX291dGZpdHNdLCBcInJlYWRvbmx5XCIpXG4gICAgICAgIC5vYmplY3RTdG9yZShUYWJsZXMuZmF2b3VyaXRlX291dGZpdHMpXG4gICAgICAgIC5nZXQoaWQpXG5cbiAgICAgIGNvbnN0IGZhdm91cml0ZTogRmF2b3VyaXRlT3V0Zml0ID0gcmVxdWVzdC5yZXN1bHRcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKTogdm9pZCA9PlxuICAgICAgICByZXNvbHZlKHsgLi4uZmF2b3VyaXRlLCB1cmw6IFVSTC5jcmVhdGVPYmplY3RVUkwoZmF2b3VyaXRlLmJsb2IpIH0pXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGdldEZhdm91cml0ZU91dGZpdHMoKTogUHJvbWlzZTxGYXZvdXJpdGVPdXRmaXRbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXRoaXMuZGIpIHJldHVybiB2b2lkIHJlamVjdCgpXG5cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmRiXG4gICAgICAgIC50cmFuc2FjdGlvbihbVGFibGVzLmZhdm91cml0ZV9vdXRmaXRzXSwgXCJyZWFkb25seVwiKVxuICAgICAgICAub2JqZWN0U3RvcmUoVGFibGVzLmZhdm91cml0ZV9vdXRmaXRzKVxuICAgICAgICAuZ2V0QWxsKClcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKTogdm9pZCA9PlxuICAgICAgICByZXNvbHZlKFxuICAgICAgICAgIHJlcXVlc3QucmVzdWx0Lm1hcDxGYXZvdXJpdGVPdXRmaXQ+KChmYXZvdXJpdGU6IEZhdm91cml0ZU91dGZpdCkgPT4gKHtcbiAgICAgICAgICAgIC4uLmZhdm91cml0ZSxcbiAgICAgICAgICAgIHVybDogVVJMLmNyZWF0ZU9iamVjdFVSTChmYXZvdXJpdGUuYmxvYiksXG4gICAgICAgICAgfSkpXG4gICAgICAgIClcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBJbmRleGVkREIoKVxuIiwiZXhwb3J0IGVudW0gVGFibGVzIHtcbiAgZmF2b3VyaXRlX291dGZpdHMgPSBcImZhdm91cml0ZV9vdXRmaXRzXCIsXG59XG4iLCJleHBvcnQgZW51bSBMb2NhbFN0b3JhZ2VLZXkge1xuICBhdXRvRXhwbG9yZUxvY2F0aW9ucyA9IFwiYXV0b0V4cGxvcmVMb2NhdGlvbnNcIixcbiAgZGVidWcgPSBcImRlYnVnXCIsXG4gIGV4cGxvcmF0aW9uSGlzdG9yeSA9IFwiZXhwbG9yYXRpb25IaXN0b3J5XCIsXG4gIGV4cGxvcmF0aW9ucyA9IFwiZXhwbG9yYXRpb25zXCIsXG4gIG1hcmtldCA9IFwibWFya2V0XCIsXG4gIG1ldGEgPSBcIm1ldGFcIixcbiAgbWluaWdhbWVzID0gXCJtaW5pZ2FtZXNcIixcbiAgcHVyY2hhc2VzID0gXCJwdXJjaGFzZXNcIixcbiAgc2FsZXMgPSBcInNhbGVzXCIsXG4gIHVubG9ja2VkID0gXCJ1bmxvY2tlZFwiLFxuICB2ZXJzaW9uID0gXCJ2ZXJzaW9uXCIsXG4gIHdpc2hsaXN0ID0gXCJ3aXNobGlzdFwiLFxufVxuIiwiaW1wb3J0IHsgYmFzZTY0U3RyaW5nVG9CbG9iLCBibG9iVG9CYXNlNjRTdHJpbmcgfSBmcm9tIFwiYmxvYi11dGlsXCJcbmltcG9ydCB0eXBlIHsgTWV0YSB9IGZyb20gXCIuLi9hcGkvbWV0YVwiXG5pbXBvcnQgdHlwZSB7IEZhdm91cml0ZU91dGZpdCB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL2ludGVyZmFjZXMvZmF2b3VyaXRlX291dGZpdFwiXG5pbXBvcnQgaW5kZXhlZF9kYiBmcm9tIFwiLi4vaW5kZXhlZF9kYi9pbmRleGVkX2RiXCJcbmltcG9ydCB0eXBlIHsgTWFya2V0RW50cnkgfSBmcm9tIFwiLi4vbWFya2V0cGxhY2UvaW50ZXJmYWNlcy9tYXJrZXRfZW50cnlcIlxuaW1wb3J0IHR5cGUgeyBTZXR0aW5ncyB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9zZXR0aW5nc1wiXG5pbXBvcnQgdHlwZSB7IEF1dG9FeHBsb3JlTG9jYXRpb24gfSBmcm9tIFwiLi9hdXRvX2V4cGxvcmVfbG9jYXRpb25cIlxuaW1wb3J0IHR5cGUgeyBFeHBsb3JhdGlvblJlc3VsdCB9IGZyb20gXCIuL2V4cGxvcmF0aW9uX3Jlc3VsdFwiXG5pbXBvcnQgdHlwZSB7IEV4cG9ydGFibGVGYXZvdXJpdGUgfSBmcm9tIFwiLi9leHBvcnRhYmxlX2Zhdm91cml0ZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VLZXkgfSBmcm9tIFwiLi9sb2NhbF9zdG9yYWdlLmVudW1cIlxuaW1wb3J0IHR5cGUgeyBTYWxlIH0gZnJvbSBcIi4vc2FsZVwiXG5pbXBvcnQgdHlwZSB7IFdpc2hlZEl0ZW0gfSBmcm9tIFwiLi93aXNoZWRfaXRlbVwiXG5cbmV4cG9ydCBjbGFzcyBMb2NhbFN0b3JhZ2Uge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBsb2NhbFN0b3JhZ2UgPSBsb2NhbFN0b3JhZ2VcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgZ2V0IGF1dG9FeHBsb3JlTG9jYXRpb25zKCk6IEF1dG9FeHBsb3JlTG9jYXRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbTxBdXRvRXhwbG9yZUxvY2F0aW9uW10+KFxuICAgICAgTG9jYWxTdG9yYWdlS2V5LmF1dG9FeHBsb3JlTG9jYXRpb25zLFxuICAgICAgW11cbiAgICApXG4gIH1cblxuICBzdGF0aWMgc2V0IGF1dG9FeHBsb3JlTG9jYXRpb25zKGxvY2F0aW9uczogQXV0b0V4cGxvcmVMb2NhdGlvbltdKSB7XG4gICAgdGhpcy5zZXRJdGVtKExvY2FsU3RvcmFnZUtleS5hdXRvRXhwbG9yZUxvY2F0aW9ucywgbG9jYXRpb25zKVxuICB9XG5cbiAgc3RhdGljIGdldCBkZWJ1ZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtPGJvb2xlYW4+KExvY2FsU3RvcmFnZUtleS5kZWJ1ZywgZmFsc2UpXG4gIH1cblxuICBzdGF0aWMgc2V0IGRlYnVnKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldEl0ZW0oTG9jYWxTdG9yYWdlS2V5LmRlYnVnLCBlbmFibGVkKVxuICB9XG5cbiAgc3RhdGljIGdldCBleHBsb3JhdGlvbkhpc3RvcnkoKTogRXhwbG9yYXRpb25SZXN1bHRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbTxFeHBsb3JhdGlvblJlc3VsdFtdPihcbiAgICAgIExvY2FsU3RvcmFnZUtleS5leHBsb3JhdGlvbkhpc3RvcnksXG4gICAgICBbXVxuICAgIClcbiAgfVxuXG4gIHN0YXRpYyBzZXQgZXhwbG9yYXRpb25IaXN0b3J5KGV4cGxvcmF0aW9uSGlzdG9yeTogRXhwbG9yYXRpb25SZXN1bHRbXSkge1xuICAgIHRoaXMuc2V0SXRlbShMb2NhbFN0b3JhZ2VLZXkuZXhwbG9yYXRpb25IaXN0b3J5LCBleHBsb3JhdGlvbkhpc3RvcnkpXG4gIH1cblxuICBzdGF0aWMgZ2V0IGV4cGxvcmF0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtPGJvb2xlYW4+KExvY2FsU3RvcmFnZUtleS5leHBsb3JhdGlvbnMsIGZhbHNlKVxuICB9XG5cbiAgc3RhdGljIHNldCBleHBsb3JhdGlvbnMoZW5hYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0SXRlbShMb2NhbFN0b3JhZ2VLZXkuZXhwbG9yYXRpb25zLCBlbmFibGVkKVxuICB9XG5cbiAgc3RhdGljIGdldCBtYXJrZXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbTxib29sZWFuPihMb2NhbFN0b3JhZ2VLZXkubWFya2V0LCBmYWxzZSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgbWFya2V0KGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldEl0ZW0oTG9jYWxTdG9yYWdlS2V5Lm1hcmtldCwgZW5hYmxlZClcbiAgfVxuXG4gIHN0YXRpYyBnZXQgbWV0YSgpOiBNZXRhIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbTxNZXRhIHwgbnVsbD4oTG9jYWxTdG9yYWdlS2V5Lm1ldGEsIG51bGwpXG4gIH1cblxuICBzdGF0aWMgc2V0IG1ldGEobWV0YTogTWV0YSB8IG51bGwpIHtcbiAgICB0aGlzLnNldEl0ZW0oTG9jYWxTdG9yYWdlS2V5Lm1ldGEsIG1ldGEpXG4gIH1cblxuICBzdGF0aWMgZ2V0IG1pbmlnYW1lcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtPGJvb2xlYW4+KExvY2FsU3RvcmFnZUtleS5taW5pZ2FtZXMsIGZhbHNlKVxuICB9XG5cbiAgc3RhdGljIHNldCBtaW5pZ2FtZXMoZW5hYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0SXRlbShMb2NhbFN0b3JhZ2VLZXkubWluaWdhbWVzLCBlbmFibGVkKVxuICB9XG5cbiAgc3RhdGljIGdldCBwdXJjaGFzZXMoKTogTWFya2V0RW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbTxNYXJrZXRFbnRyeVtdPihMb2NhbFN0b3JhZ2VLZXkucHVyY2hhc2VzLCBbXSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgcHVyY2hhc2VzKGVudHJ5OiBNYXJrZXRFbnRyeVtdKSB7XG4gICAgdGhpcy5zZXRJdGVtKExvY2FsU3RvcmFnZUtleS5wdXJjaGFzZXMsIGVudHJ5KVxuICB9XG5cbiAgc3RhdGljIGdldCBzYWxlcygpOiBTYWxlW10ge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW08U2FsZVtdPihMb2NhbFN0b3JhZ2VLZXkuc2FsZXMsIFtdKVxuICB9XG5cbiAgc3RhdGljIHNldCBzYWxlcyhzYWxlOiBTYWxlW10pIHtcbiAgICB0aGlzLnNldEl0ZW0oTG9jYWxTdG9yYWdlS2V5LnNhbGVzLCBzYWxlKVxuICB9XG5cbiAgc3RhdGljIGdldCB1bmxvY2tlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtPGJvb2xlYW4+KExvY2FsU3RvcmFnZUtleS51bmxvY2tlZCwgZmFsc2UpXG4gIH1cblxuICBzdGF0aWMgc2V0IHVubG9ja2VkKHVubG9ja2VkOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRJdGVtKExvY2FsU3RvcmFnZUtleS51bmxvY2tlZCwgdW5sb2NrZWQpXG4gIH1cblxuICBzdGF0aWMgZ2V0IHZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtPHN0cmluZz4oTG9jYWxTdG9yYWdlS2V5LnZlcnNpb24sIFwiXCIpXG4gIH1cblxuICBzdGF0aWMgc2V0IHZlcnNpb24odmVyc2lvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRJdGVtKExvY2FsU3RvcmFnZUtleS52ZXJzaW9uLCB2ZXJzaW9uKVxuICB9XG5cbiAgc3RhdGljIGdldCB3aXNobGlzdCgpOiBXaXNoZWRJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW08V2lzaGVkSXRlbVtdPihMb2NhbFN0b3JhZ2VLZXkud2lzaGxpc3QsIFtdKVxuICB9XG5cbiAgc3RhdGljIHNldCB3aXNobGlzdChsb2NhdGlvbnM6IFdpc2hlZEl0ZW1bXSkge1xuICAgIHRoaXMuc2V0SXRlbShMb2NhbFN0b3JhZ2VLZXkud2lzaGxpc3QsIGxvY2F0aW9ucylcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRTZXR0aW5ncygpOiBQcm9taXNlPFNldHRpbmdzPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF1dG9FeHBsb3JlTG9jYXRpb25zOiB0aGlzLmF1dG9FeHBsb3JlTG9jYXRpb25zLFxuICAgICAgZGVidWc6IHRoaXMuZGVidWcsXG4gICAgICBleHBsb3JhdGlvbkhpc3Rvcnk6IHRoaXMuZXhwbG9yYXRpb25IaXN0b3J5LFxuICAgICAgZXhwbG9yYXRpb25zOiB0aGlzLmV4cGxvcmF0aW9ucyxcbiAgICAgIGZhdm91cml0ZXM6IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAoXG4gICAgICAgICAgYXdhaXQgaW5kZXhlZF9kYi5nZXRGYXZvdXJpdGVPdXRmaXRzKClcbiAgICAgICAgKS5tYXA8UHJvbWlzZTxFeHBvcnRhYmxlRmF2b3VyaXRlPj4oYXN5bmMgZmF2b3VyaXRlID0+ICh7XG4gICAgICAgICAgbmFtZTogZmF2b3VyaXRlLm5hbWUsXG4gICAgICAgICAgaXRlbXM6IGZhdm91cml0ZS5pdGVtcyxcbiAgICAgICAgICBiYXNlNjQ6IGF3YWl0IGJsb2JUb0Jhc2U2NFN0cmluZyhmYXZvdXJpdGUuYmxvYiksXG4gICAgICAgIH0pKVxuICAgICAgKSxcbiAgICAgIG1hcmtldDogdGhpcy5tYXJrZXQsXG4gICAgICBtaW5pZ2FtZXM6IHRoaXMubWluaWdhbWVzLFxuICAgICAgdW5sb2NrZWQ6IHRoaXMudW5sb2NrZWQsXG4gICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICB3aXNobGlzdDogdGhpcy53aXNobGlzdCxcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgc2V0U2V0dGluZ3Moc2V0dGluZ3M6IFNldHRpbmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hdXRvRXhwbG9yZUxvY2F0aW9ucyA9IHNldHRpbmdzLmF1dG9FeHBsb3JlTG9jYXRpb25zXG4gICAgdGhpcy5kZWJ1ZyA9IHNldHRpbmdzLmRlYnVnXG4gICAgdGhpcy5leHBsb3JhdGlvbkhpc3RvcnkgPSBzZXR0aW5ncy5leHBsb3JhdGlvbkhpc3RvcnlcbiAgICB0aGlzLmV4cGxvcmF0aW9ucyA9IHNldHRpbmdzLmV4cGxvcmF0aW9uc1xuICAgIHRoaXMubWFya2V0ID0gc2V0dGluZ3MubWFya2V0XG4gICAgdGhpcy5taW5pZ2FtZXMgPSBzZXR0aW5ncy5taW5pZ2FtZXNcbiAgICB0aGlzLnVubG9ja2VkID0gc2V0dGluZ3MudW5sb2NrZWRcbiAgICB0aGlzLnZlcnNpb24gPSBzZXR0aW5ncy52ZXJzaW9uXG4gICAgdGhpcy53aXNobGlzdCA9IHNldHRpbmdzLndpc2hsaXN0XG5cbiAgICBhd2FpdCBpbmRleGVkX2RiLmNsZWFyRmF2b3VyaXRlT3V0Zml0cygpXG4gICAgZm9yIChjb25zdCBmYXZvdXJpdGUgb2Ygc2V0dGluZ3MuZmF2b3VyaXRlcy5tYXA8RmF2b3VyaXRlT3V0Zml0PihcbiAgICAgIGZhdm91cml0ZSA9PiAoe1xuICAgICAgICBibG9iOiBiYXNlNjRTdHJpbmdUb0Jsb2IoZmF2b3VyaXRlLmJhc2U2NCksXG4gICAgICAgIGl0ZW1zOiBmYXZvdXJpdGUuaXRlbXMsXG4gICAgICAgIG5hbWU6IGZhdm91cml0ZS5uYW1lLFxuICAgICAgfSlcbiAgICApKSB7XG4gICAgICB2b2lkIGluZGV4ZWRfZGIuYWRkRmF2b3VyaXRlT3V0Zml0KGZhdm91cml0ZSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRJdGVtPFQ+KGtleTogTG9jYWxTdG9yYWdlS2V5LCBmYWxsYmFjazogVCk6IFQge1xuICAgIHJldHVybiAoSlNPTi5wYXJzZShcbiAgICAgIHRoaXMubG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSA/PyBKU09OLnN0cmluZ2lmeShmYWxsYmFjaylcbiAgICApID8/IGZhbGxiYWNrKSBhcyBUXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzZXRJdGVtPFQ+KGtleTogTG9jYWxTdG9yYWdlS2V5LCB2YWx1ZTogVCk6IHZvaWQge1xuICAgIHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpXG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIEJvZHlMb2NhdGlvbiB7XG4gIEFsbCA9IFwiXCIsXG4gIFVuZGVyd2VhciA9IDEsXG4gIFNraW5zID0gMixcbiAgVGF0dG9vcyA9IDIwLFxuICBNb3V0aHMgPSAyMSxcbiAgRXllcyA9IDMsXG4gIEhhaXIgPSA0LFxuICBTb2NrcyA9IDUsXG4gIFNob2VzID0gNixcbiAgUGFudHMgPSA3LFxuICBIYW5kQWNjZXNzb3JpZXMgPSA4LFxuICBUb3BzID0gOSxcbiAgQ29hdHMgPSAxMCxcbiAgR2xvdmVzID0gMTEsXG4gIE5lY2tsYWNlcyA9IDEyLFxuICBEcmVzc2VzID0gMTMsXG4gIEhhdHMgPSAxNCxcbiAgRmFjZUFjY2Vzc29yaWVzID0gMTUsXG4gIEZ1bmRzID0gMTYsXG4gIEJlbHRzID0gMTgsXG4gIEF0bW9zcGhlcmVzID0gMTksXG59XG4iLCJpbXBvcnQgeyBUeXBlIH0gZnJvbSBcIi4vdHlwZS5lbnVtXCJcblxuZXhwb3J0IGVudW0gQ2F0ZWdvcnlTdHJpbmcge1xuICBhbGwgPSBcIlwiLFxuICBmb29kID0gXCJmb29kXCIsXG4gIGFsY2hlbXkgPSBcImFsY2hlbXlcIixcbiAgdXRpbGl0eSA9IFwidXRpbGl0eVwiLFxuICB0YW1lID0gXCJ0YW1lXCIsXG59XG5cbmV4cG9ydCBlbnVtIENhdGVnb3J5TnVtYmVyIHtcbiAgYWxsID0gQ2F0ZWdvcnlTdHJpbmcuYWxsLFxuICBmb29kID0gMSxcbiAgYWxjaGVteSA9IFR5cGUuQ29uc3VtYWJsZSxcbiAgdXRpbGl0eSA9IDMsXG4gIHRhbWUgPSA0LFxufVxuIiwiZXhwb3J0IGVudW0gR3VhcmQge1xuICBhbnkgPSBcIlwiLFxuICBsaWdodCA9IDEsXG4gIG9ic2lkaWFuLFxuICBhYnN5bnRoZSxcbiAgc2hhZG93LFxufVxuIiwiZXhwb3J0IGVudW0gUmFyaXR5IHtcbiAgYWxsID0gXCJcIixcbiAgY29tbW9uID0gXCJjb21tb25cIixcbiAgcmFyZSA9IFwicmFyZVwiLFxuICBlcGljID0gXCJlcGljXCIsXG4gIGxlZ2VuZGFyeSA9IFwibGVnZW5kYXJ5XCIsXG4gIGV2ZW50ID0gXCJldmVudFwiLFxufVxuIiwiZXhwb3J0IGVudW0gVHlwZSB7XG4gIEFsbCA9IFwiXCIsXG4gIEJhZyA9IFwiQmFnXCIsXG4gIENvbnN1bWFibGUgPSBcIkNvbnN1bWFibGVcIixcbiAgRWdnSXRlbSA9IFwiRWdnSXRlbVwiLFxuICBQbGF5ZXJXZWFyYWJsZUl0ZW0gPSBcIlBsYXllcldlYXJhYmxlSXRlbVwiLFxuICBRdWVzdEl0ZW0gPSBcIlF1ZXN0SXRlbVwiLFxufVxuIiwiaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuLi9jb25zb2xlXCJcbmltcG9ydCB7IHRyaW1JY29uIH0gZnJvbSBcIi4uL2VsZGFyeWFfdXRpbFwiXG5pbXBvcnQgeyBSYXJpdHkgfSBmcm9tIFwiLi9lbnVtcy9yYXJpdHkuZW51bVwiXG5pbXBvcnQgdHlwZSB7IEJ1eU5vd1ByaWNlIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9idXlfbm93X3ByaWNlXCJcbmltcG9ydCB0eXBlIHsgQ3VycmVudFByaWNlIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9jdXJyZW50X3ByaWNlXCJcbmltcG9ydCB0eXBlIHsgTWFya2V0RW50cnkgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL21hcmtldF9lbnRyeVwiXG5pbXBvcnQgdHlwZSB7IE1hcmtldEVudHJ5RGF0YVNldCB9IGZyb20gXCIuL2ludGVyZmFjZXMvbWFya2V0X2VudHJ5X2RhdGFfc2V0XCJcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEl0ZW1EZXRhaWxzKGxpOiBIVE1MTElFbGVtZW50KTogTWFya2V0RW50cnkgfCBudWxsIHtcbiAgY29uc3QgZGF0YXNldCA9IGxpLmRhdGFzZXQgYXMgdW5rbm93biBhcyBNYXJrZXRFbnRyeURhdGFTZXRcbiAgY29uc3QgbmFtZSA9IGxpLnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFwiLmFic3RyYWN0LW5hbWVcIik/LmlubmVyVGV4dFxuICBjb25zdCBhYnN0cmFjdFR5cGUgPVxuICAgIGxpLnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFwiLmFic3RyYWN0LXR5cGVcIik/LmlubmVyVGV4dFxuICBjb25zdCBzcmMgPSBsaS5xdWVyeVNlbGVjdG9yPEhUTUxJbWFnZUVsZW1lbnQ+KFwiLmFic3RyYWN0LWljb24gaW1nXCIpPy5zcmNcblxuICBjb25zdCByYXJpdHk6IFJhcml0eSA9XG4gICAgUmFyaXR5W1xuICAgICAgKGxpXG4gICAgICAgIC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIFwiLnJhcml0eS1tYXJrZXItY29tbW9uLCAucmFyaXR5LW1hcmtlci1yYXJlLCAucmFyaXR5LW1hcmtlci1lcGljLCAucmFyaXR5LW1hcmtlci1sZWdlbmRhcnksIC5yYXJpdHktbWFya2VyLWV2ZW50XCJcbiAgICAgICAgKVxuICAgICAgICA/LmNsYXNzTmFtZS5zcGxpdChcInJhcml0eS1tYXJrZXItXCIpWzFdID8/IFwiXCIpIGFzIGtleW9mIHR5cGVvZiBSYXJpdHlcbiAgICBdXG5cbiAgY29uc3QgY3VycmVudFByaWNlID0gbGkucXVlcnlTZWxlY3RvcjxIVE1MSW1hZ2VFbGVtZW50PihcbiAgICBcIi5wcmljZS1pdGVtW2RhdGEtYmlkc11cIlxuICApPy5kYXRhc2V0IGFzIHVua25vd24gYXMgQ3VycmVudFByaWNlXG5cbiAgY29uc3QgYnV5Tm93UHJpY2UgPSBsaS5xdWVyeVNlbGVjdG9yPEhUTUxJbWFnZUVsZW1lbnQ+KFxuICAgIFwiLnByaWNlLWl0ZW06bm90KFtkYXRhLWJpZHNdKVwiXG4gICk/LmRhdGFzZXQgYXMgdW5rbm93biBhcyBCdXlOb3dQcmljZVxuXG4gIGlmICghc3JjIHx8ICFuYW1lKSB7XG4gICAgQ29uc29sZS53YXJuKFwiSW5jb21wbGV0ZSBtYXJrZXQgZW50cnlcIiwgbGkpXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uZGF0YXNldCxcbiAgICBpY29uOiB0cmltSWNvbihzcmMpLFxuICAgIHJhcml0eSxcbiAgICBuYW1lLFxuICAgIGFic3RyYWN0VHlwZSxcbiAgICBidXlOb3dQcmljZSxcbiAgICBjdXJyZW50UHJpY2UsXG4gICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIE1hdGhVdGlsIHtcbiAgc3RhdGljIHJlYWRvbmx5IHBoaSA9ICgxICsgTWF0aC5zcXJ0KDUpKSAvIDJcblxuICBzdGF0aWMgcmFuZG9tQmV0d2VlbihtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikgKyBtaW5cbiAgfVxufVxuIiwiaW1wb3J0IHsgTG9jYWxTdG9yYWdlIH0gZnJvbSBcIi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcblxuZXhwb3J0IGZ1bmN0aW9uIG1pZ3JhdGUoKTogdm9pZCB7XG4gIHN3aXRjaCAoTG9jYWxTdG9yYWdlLnZlcnNpb24pIHtcbiAgICBjYXNlIEdNLmluZm8uc2NyaXB0LnZlcnNpb246XG4gICAgICByZXR1cm5cblxuICAgIGNhc2UgXCJcIjpcbiAgICAgIGluc3RhbGxlZCgpXG4gICAgICBicmVha1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHN3aXRjaCAoR00uaW5mby5zY3JpcHQudmVyc2lvbikge1xuICAgICAgICBjYXNlIFwiMS4yLjBcIjpcbiAgICAgICAgICB2MV8yXzAoKVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBcIjEuMi45XCI6XG4gICAgICAgICAgdjFfMl85KClcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCIxLjIuMTBcIjpcbiAgICAgICAgICB2MV8yXzEwKClcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCIxLjIuMTNcIjpcbiAgICAgICAgICB2MV8yXzEzKClcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaW5zdGFsbGVkKClcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICB9XG5cbiAgTG9jYWxTdG9yYWdlLnZlcnNpb24gPSBHTS5pbmZvLnNjcmlwdC52ZXJzaW9uXG59XG5cbmZ1bmN0aW9uIGluc3RhbGxlZCgpOiB2b2lkIHtcbiAgJC5mbGF2ck5vdGlmKGAke25hbWUoKX0gJHt2ZXJzaW9uKCl9IGluc3RhbGxlZCFgKVxufVxuXG5mdW5jdGlvbiBuYW1lKCk6IHN0cmluZyB7XG4gIHJldHVybiBgPHN0cm9uZz4ke0dNLmluZm8uc2NyaXB0Lm5hbWV9PC9zdHJvbmc+YFxufVxuXG5mdW5jdGlvbiB2ZXJzaW9uKCk6IHN0cmluZyB7XG4gIHJldHVybiBgdjxzdHJvbmc+JHtHTS5pbmZvLnNjcmlwdC52ZXJzaW9ufTwvc3Ryb25nPmBcbn1cblxuZnVuY3Rpb24gdjFfMl8wKCk6IHZvaWQge1xuICBMb2NhbFN0b3JhZ2Uuc2FsZXMgPSBbXVxuICAkLmZsYXZyTm90aWYoYFVwZGF0ZWQgdG8gJHt2ZXJzaW9uKCl9LiBZb3VyIHNhbGVzIGhpc3Rvcnkgd2FzIGVyYXNlZC5gKVxufVxuXG5mdW5jdGlvbiB2MV8yXzkoKTogdm9pZCB7XG4gICQuZmxhdnJOb3RpZihcbiAgICBgVXBkYXRlZCB0byAke3ZlcnNpb24oKX0uIFRoZSB3aXNobGlzdCBoYXMgYmVlbiBpbXByb3ZlZCB0byBzb3J0IGJ5IGNhdGVnb3J5L3R5cGUvbmFtZSwgYnV0IHlvdXIgd2lzaGVkIGl0ZW1zIGRvIG5vdCBoYXZlIGEgdHlwZS4gWW91IGNhbiBhZGQgdHlwZXMgYnkgcmUtYWRkaW5nIHRoZSBpdGVtcyB2aWEgdGhlIG1hcmtldC5gXG4gIClcbn1cblxuZnVuY3Rpb24gdjFfMl8xMCgpOiB2b2lkIHtcbiAgJC5mbGF2ck5vdGlmKFxuICAgIGBVcGRhdGVkIHRvICR7dmVyc2lvbigpfS4gVGhlIHdpc2hsaXN0IGhhcyBiZWVuIGltcHJvdmVkIHRvIHNvcnQgYnkgY2F0ZWdvcnkvdHlwZS9yYXJpdHkvbmFtZSwgYnV0IHlvdXIgd2lzaGVkIGl0ZW1zIGRvIG5vdCBoYXZlIGEgcmFyaXR5LiBZb3UgY2FuIGFkZCByYXJpdGllcyBieSByZS1hZGRpbmcgdGhlIGl0ZW1zIHZpYSB0aGUgbWFya2V0LmBcbiAgKVxufVxuXG5mdW5jdGlvbiB2MV8yXzEzKCk6IHZvaWQge1xuICAkLmZsYXZyTm90aWYoXG4gICAgYFVwZGF0ZWQgdG8gJHt2ZXJzaW9uKCl9LiBUaGUgZW5oYW5jZWQgZHJlc3NpbmcgZXhwZXJpZW5jZSB3YXMgZGlzYWJsZWQuYFxuICApXG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB0eXBlIHsgR2V0UHJpemVzRGF0YSB9IGZyb20gXCIuLi9hcGkvZ2V0X3ByaXplc19kYXRhXCJcbmltcG9ydCB0eXBlIHsgUGFja2V0IH0gZnJvbSBcIi4uL2FwaS9wYWNrZXRcIlxuaW1wb3J0IHR5cGUgeyBTdGFydEdhbWVEYXRhIH0gZnJvbSBcIi4uL2FwaS9zdGFydF9nYW1lX2RhdGFcIlxuaW1wb3J0IFwiLi4vZWxkYXJ5YS9qcXVlcnlcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB7IGZsYXBweSB9IGZyb20gXCIuL2ZsYXBweVwiXG5pbXBvcnQgeyBoYXRjaGxpbmdzIH0gZnJvbSBcIi4vaGF0Y2hsaW5nc1wiXG5pbXBvcnQgdHlwZSB7IE1pbmlnYW1lIH0gZnJvbSBcIi4vbWluaWdhbWVcIlxuaW1wb3J0IHsgcGVnZ2xlIH0gZnJvbSBcIi4vcGVnZ2xlXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBsYXlQZWdnbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBwbGF5KHBlZ2dsZSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBsYXlGbGFwcHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBwbGF5KGZsYXBweSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBsYXlIYXRjaGxpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gcGxheShoYXRjaGxpbmdzKVxufVxuXG5hc3luYyBmdW5jdGlvbiBwbGF5KG1pbmlnYW1lOiBNaW5pZ2FtZSk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBEaXNhYmxlIGJ1dHRvbnNcbiAgYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbj4ocmVzb2x2ZSA9PiB7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCBidXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oXG4gICAgICAgIFwiLm1pbmlnYW1lcy1ydWxlcyAuZmxhdnItYnV0dG9uXCJcbiAgICAgIClcblxuICAgICAgaWYgKGJ1dHRvbnMubGVuZ3RoKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpXG5cbiAgICAgICAgZm9yIChjb25zdCBidXR0b24gb2YgYnV0dG9ucykge1xuICAgICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwiZGlzYWJsZWRcIilcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgIH1cbiAgICB9LCAyNTApXG4gIH0pXG5cbiAgY29uc3QganNvbiA9IGF3YWl0IGV4ZWN1dGUobWluaWdhbWUpXG5cbiAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2ZsYXZyX25vdGlmL2ljb25fbWVzc2FnZS5odG1sXCIpXG4gICQuZmxhdnJOb3RpZihcbiAgICB0ZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgLi4ubWluaWdhbWUsXG4gICAgICBtZXNzYWdlOiB0cmFuc2xhdGUubWluaWdhbWVzLnBsYXlpbmcobWluaWdhbWUubmFtZSksXG4gICAgfSlcbiAgKVxuXG4gIGNvbnN0IGdhbWVUb2tlbiA9IGpzb24uZGF0YVxuICBjb25zdCBzY29yZSA9IHJhbmRvbUludChtaW5pZ2FtZS5zY29yZU1pbiwgbWluaWdhbWUuc2NvcmVNYXgpXG4gIGNvbnN0IGVuY190b2tlbiA9IHhvckVuY29kZShnYW1lVG9rZW4sIHNjb3JlLnRvU3RyaW5nKCkpXG4gIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT5cbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIHJhbmRvbUludChtaW5pZ2FtZS5kZWxheU1pbiwgbWluaWdhbWUuZGVsYXlNYXgpKVxuICApXG5cbiAgYXdhaXQgZ2V0UHJpemVzKG1pbmlnYW1lLCBnYW1lVG9rZW4sIHNjb3JlKVxuICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgcmFuZG9tSW50KDEwMDAsIDMwMDApKSlcblxuICBhd2FpdCBzZW5kKGVuY190b2tlbiwgc2NvcmUsIG1pbmlnYW1lLm5hbWUudG9Mb3dlckNhc2UoKSlcbiAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHJhbmRvbUludCgxMDAwLCAzMDAwKSkpXG59XG5cbmZ1bmN0aW9uIHJhbmRvbUludChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpICsgbWluKVxufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlKG1pbmlnYW1lOiBNaW5pZ2FtZSk6IFByb21pc2U8UGFja2V0PFN0YXJ0R2FtZURhdGE+PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxQYWNrZXQ8U3RhcnRHYW1lRGF0YT4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpZiAodHlwZW9mIFJlY2FwdGNoYSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgUmVjYXB0Y2hhLmV4ZWN1dGUoXG4gICAgICAgIGBtaW5pZ2FtZVN0YXJ0JHttaW5pZ2FtZS5uYW1lfWAsXG4gICAgICAgICh0b2tlbik6IHZvaWQgPT5cbiAgICAgICAgICB2b2lkIHN0YXJ0R2FtZShtaW5pZ2FtZSwgdG9rZW4pLnRoZW4ocmVzb2x2ZSkuY2F0Y2gocmVqZWN0KVxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB2b2lkIHN0YXJ0R2FtZShtaW5pZ2FtZSkudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpXG4gICAgfVxuICB9KVxufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydEdhbWUoXG4gIG1pbmlnYW1lOiBNaW5pZ2FtZSxcbiAgcmVjYXB0Y2hhVG9rZW4/OiBzdHJpbmdcbik6IFByb21pc2U8UGFja2V0PFN0YXJ0R2FtZURhdGE+PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxQYWNrZXQ8U3RhcnRHYW1lRGF0YT4+KFxuICAgIChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgICB2b2lkICQuYWpheCh7XG4gICAgICAgIHVybDogXCIvbWluaWdhbWVzL2FqYXhfc3RhcnRHYW1lXCIsXG4gICAgICAgIHR5cGU6IFwicG9zdFwiLFxuICAgICAgICBkYXRhVHlwZTogXCJqc29uXCIsXG4gICAgICAgIGRhdGE6IHJlY2FwdGNoYVRva2VuXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGdhbWU6IG1pbmlnYW1lLm5hbWUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICAgcmVjYXB0Y2hhVG9rZW46IHJlY2FwdGNoYVRva2VuLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBnYW1lOiBtaW5pZ2FtZS5uYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICBzdWNjZXNzOiAoanNvbjogUGFja2V0PFN0YXJ0R2FtZURhdGE+KTogdm9pZCA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShqc29uKVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCk6IHZvaWQgPT4ge1xuICAgICAgICAgIHJlamVjdCgpXG4gICAgICAgIH0sXG4gICAgICB9KVxuICApXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFByaXplcyhcbiAgbWluaWdhbWU6IE1pbmlnYW1lLFxuICBnYW1lVG9rZW46IHN0cmluZyxcbiAgc2NvcmU6IG51bWJlclxuKTogUHJvbWlzZTxQYWNrZXQ8R2V0UHJpemVzRGF0YT4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFBhY2tldDxHZXRQcml6ZXNEYXRhPj4oXG4gICAgKHJlc29sdmUpOiB2b2lkID0+XG4gICAgICB2b2lkICQucG9zdChcbiAgICAgICAgXCIvbWluaWdhbWVzL2FqYXhfZ2V0UHJpemVzXCIsXG4gICAgICAgIHsgZ2FtZTogbWluaWdhbWUubmFtZS50b0xvd2VyQ2FzZSgpLCBzY29yZTogc2NvcmUgfSxcbiAgICAgICAgKGpzb246IFBhY2tldDxHZXRQcml6ZXNEYXRhPik6IHZvaWQgPT4ge1xuICAgICAgICAgIHJlc29sdmUoanNvbilcblxuICAgICAgICAgIGlmIChqc29uLnJlc3VsdCA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9mbGF2cl9ub3RpZi9pY29uX21lc3NhZ2UuaHRtbFwiKVxuXG4gICAgICAgICAgICAkLmZsYXZyTm90aWYoXG4gICAgICAgICAgICAgIHRlbXBsYXRlLnJlbmRlcih7XG4gICAgICAgICAgICAgICAgLi4ubWluaWdhbWUsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogdHJhbnNsYXRlLm1pbmlnYW1lcy5wbGF5ZWRfZm9yKFxuICAgICAgICAgICAgICAgICAgbWluaWdhbWUubmFtZSxcbiAgICAgICAgICAgICAgICAgIGpzb24uZGF0YS5tYWFuYVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSBlbHNlICQuZmxhdnJOb3RpZihqc29uLmRhdGEpXG4gICAgICAgIH0sXG4gICAgICAgIFwianNvblwiXG4gICAgICApLmZhaWwoKCkgPT5cbiAgICAgICAgc2V0VGltZW91dCgoKTogdm9pZCA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShnZXRQcml6ZXMobWluaWdhbWUsIGdhbWVUb2tlbiwgc2NvcmUpKVxuICAgICAgICB9LCByYW5kb21JbnQoMTAwMCwgMzAwMCkpXG4gICAgICApXG4gIClcbn1cblxuLyoqXG4gKiBTw6ljdXJpc2F0aW9uIGRlIGwnZW52b2kgZHUgc2NvcmVcbiAqIEJhc8OpIHN1ciBsJ2VuY29kYWdlIFhPUiA6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWE9SX2NpcGhlclxuICogRWZmZWN0dWUgdW4gWE9SIGJpdCDDoCBiaXQgZW50cmUgdW5lIGNoYWluZSBldCB1bmUgY2zDqVxuICovXG5mdW5jdGlvbiB4b3JFbmNvZGUoc3RyOiBzdHJpbmcsIGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQXNzdXJlIHF1ZSBsZXMgZGV1eCBwYXJhbcOodHJlcyBzb2llbnQgZGVzIGNoYWluZXMgZGUgY2FyYWN0w6hyZVxuICBzdHIgPSBzdHIudG9TdHJpbmcoKVxuICBrZXkgPSBrZXkudG9TdHJpbmcoKVxuXG4gIC8qKiBFbmNvZGFnZSBYT1IgKi9cbiAgbGV0IHhvciA9IFwiXCJcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1mb3Itb2ZcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBsZXQgdG1wID0gc3RyW2ldXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBrZXkubGVuZ3RoOyArK2opIHtcbiAgICAgIHRtcCA9IFN0cmluZy5mcm9tQ2hhckNvZGUodG1wIS5jaGFyQ29kZUF0KDApIF4ga2V5LmNoYXJDb2RlQXQoaikpXG4gICAgfVxuICAgIHhvciArPSB0bXBcbiAgfVxuXG4gIC8vIFJlbnZvaWUgbGUgcsOpc3VsdGF0IGVuIGVuY29kYW50IGxlcyBjYXJhY3TDqHJlcyBzcMOpY2lhdXggcG91dmFudCBwb3NlciBwcm9ibMOobWUgKFxcbiBwYXIgZXhlbXBsZSlcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh4b3IpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNlbmQoXG4gIGVuY190b2tlbjogc3RyaW5nLFxuICBzY29yZTogbnVtYmVyLFxuICBnYW1lOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgaWYgKHR5cGVvZiBSZWNhcHRjaGEgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIFJlY2FwdGNoYS5leGVjdXRlKFxuICAgICAgICBcIm1pbmlnYW1lU2F2ZVwiICsgZ2FtZSxcbiAgICAgICAgKHJlY2FwdGNoYVRva2VuKTogdm9pZCA9PlxuICAgICAgICAgIHZvaWQgc2F2ZVNjb3JlKGVuY190b2tlbiwgc2NvcmUsIGdhbWUsIHJlY2FwdGNoYVRva2VuKS50aGVuKHJlc29sdmUpXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHZvaWQgc2F2ZVNjb3JlKGVuY190b2tlbiwgc2NvcmUsIGdhbWUpLnRoZW4ocmVzb2x2ZSlcbiAgICB9XG4gIH0pXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVTY29yZShcbiAgZW5jX3Rva2VuOiBzdHJpbmcsXG4gIHNjb3JlOiBudW1iZXIsXG4gIGdhbWU6IHN0cmluZyxcbiAgcmVjYXB0Y2hhVG9rZW4/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSBkZWNvZGVVUklDb21wb25lbnQoZW5jX3Rva2VuKVxuXG4gICAgdm9pZCAkLmFqYXgoe1xuICAgICAgdHlwZTogXCJwb3N0XCIsXG4gICAgICB1cmw6IFwiL21pbmlnYW1lcy9hamF4X3NhdmVTY29yZVwiLFxuICAgICAgZGF0YTogcmVjYXB0Y2hhVG9rZW5cbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgICAgICBzY29yZTogc2NvcmUsXG4gICAgICAgICAgICBnYW1lOiBnYW1lLFxuICAgICAgICAgICAgcmVjYXB0Y2hhVG9rZW46IHJlY2FwdGNoYVRva2VuLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgICAgICBzY29yZTogc2NvcmUsXG4gICAgICAgICAgICBnYW1lOiBnYW1lLFxuICAgICAgICAgIH0sXG4gICAgICBzdWNjZXNzOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PlxuICAgICAgICBzZXRUaW1lb3V0KCgpOiB2b2lkID0+IHtcbiAgICAgICAgICByZXNvbHZlKHNhdmVTY29yZShlbmNfdG9rZW4sIHNjb3JlLCBnYW1lKSlcbiAgICAgICAgfSwgcmFuZG9tSW50KDEwMDAsIDMwMDApKSxcbiAgICB9KVxuICB9KVxufVxuIiwiaW1wb3J0IHR5cGUgeyBNaW5pZ2FtZSB9IGZyb20gXCIuL21pbmlnYW1lXCJcblxuZXhwb3J0IGNvbnN0IGZsYXBweTogTWluaWdhbWUgPSB7XG4gIG5hbWU6IFwiRmxhcHB5XCIsXG4gIHNjb3JlTWluOiAxODAsXG4gIHNjb3JlTWF4OiAyMDAsXG4gIGRlbGF5TWluOiA2MF8wMDAsXG4gIGRlbGF5TWF4OiA3MF8wMDAsXG4gIGJ1dHRvblNlbGVjdG9yOiAnLm1pbmlnYW1lLXN0YXJ0IFtocmVmPVwiL21pbmlnYW1lcy9idWJibHRlbXBsZVwiXSAubmwtYnV0dG9uJyxcbiAgaWNvbjogXCIvc3RhdGljL2ltZy9uZXctbGF5b3V0L21pbmlnYW1lcy9pY29uX2J1YmJsZXRlbXBsZS5wbmdcIixcbn1cbiIsImltcG9ydCB0eXBlIHsgTWluaWdhbWUgfSBmcm9tIFwiLi9taW5pZ2FtZVwiXG5cbmV4cG9ydCBjb25zdCBoYXRjaGxpbmdzOiBNaW5pZ2FtZSA9IHtcbiAgbmFtZTogXCJIYXRjaGxpbmdzXCIsXG4gIHNjb3JlTWluOiAxOCxcbiAgc2NvcmVNYXg6IDIwLFxuICBkZWxheU1pbjogMzBfMDAwLFxuICBkZWxheU1heDogMzBfMDAwLFxuICBidXR0b25TZWxlY3RvcjogJy5taW5pZ2FtZS1zdGFydCBbaHJlZj1cIi9taW5pZ2FtZXMvY29jb29uaW5waWNrXCJdIC5ubC1idXR0b24nLFxuICBpY29uOiBcIi9zdGF0aWMvaW1nL25ldy1sYXlvdXQvbWluaWdhbWVzL2ljb25fY29jb25pbnBpY2sucG5nXCIsXG59XG4iLCJpbXBvcnQgdHlwZSB7IE1pbmlnYW1lIH0gZnJvbSBcIi4vbWluaWdhbWVcIlxuXG5leHBvcnQgY29uc3QgcGVnZ2xlOiBNaW5pZ2FtZSA9IHtcbiAgbmFtZTogXCJQZWdnbGVcIixcbiAgc2NvcmVNaW46IDksXG4gIHNjb3JlTWF4OiAxMCxcbiAgZGVsYXlNaW46IDEwXzAwMCxcbiAgZGVsYXlNYXg6IDIwXzAwMCxcbiAgYnV0dG9uU2VsZWN0b3I6ICcubWluaWdhbWUtc3RhcnQgW2hyZWY9XCIvbWluaWdhbWVzL2dlbWJvbWJcIl0gLm5sLWJ1dHRvbicsXG4gIGljb246IFwiL3N0YXRpYy9pbWcvbmV3LWxheW91dC9taW5pZ2FtZXMvaWNvbl9nZW1ib21iLnBuZ1wiLFxufVxuIiwiaW1wb3J0IHR5cGUgeyBQYXJzYWJsZUl0ZW0gfSBmcm9tIFwiLi9hcHBlYXJhbmNlL2ludGVyZmFjZXMvcGFyc2FibGVfaXRlbVwiXG5pbXBvcnQgdHlwZSB7IEF2YXRhciB9IGZyb20gXCIuL2VsZGFyeWEvYXZhdGFyXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydE91dGZpdChzZWxlY3Rvcjogc3RyaW5nLCBuYW1lID0gXCJvdXRmaXRcIik6IHZvaWQge1xuICBjb25zdCBhdmF0YXIgPSBTYWNoYS5BdmF0YXIuYXZhdGFyc1tzZWxlY3Rvcl1cbiAgaWYgKCFhdmF0YXIpIHJldHVyblxuXG4gIGNvbnN0IG91dGZpdCA9IHBhcnNlQXZhdGFyKGF2YXRhcilcblxuICBjb25zdCBocmVmID1cbiAgICBcImRhdGE6dGV4dC9qc29uO2NoYXJzZXQ9dXRmLTgsXCIgK1xuICAgIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShvdXRmaXQsIHVuZGVmaW5lZCwgMikpXG5cbiAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpXG4gIGEuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBocmVmKVxuICBhLnNldEF0dHJpYnV0ZShcImRvd25sb2FkXCIsIGAke25hbWV9Lmpzb25gKVxuICBhLmNsaWNrKClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQXZhdGFyKGF2YXRhcjogQXZhdGFyKTogUGFyc2FibGVJdGVtW10ge1xuICByZXR1cm4gYXZhdGFyLmNoaWxkcmVuLm1hcChjaGlsZCA9PiB7XG4gICAgY29uc3QgaXRlbSA9IGNoaWxkLmdldEl0ZW0oKVxuICAgIHJldHVybiB7XG4gICAgICBpZDogaXRlbS5faWQsXG4gICAgICBncm91cDogaXRlbS5fZ3JvdXAsXG4gICAgICBuYW1lOiBpdGVtLl9uYW1lLFxuICAgICAgaW1hZ2U6IGl0ZW0uX2ltYWdlLFxuICAgICAgdHlwZTogaXRlbS5fdHlwZSxcbiAgICAgIGNhdGVnb3J5SWQ6IGl0ZW0uX2NhdGVnb3J5SWQsXG4gICAgICBoaWRkZW5DYXRlZ29yaWVzOiBPYmplY3QudmFsdWVzKGl0ZW0uX2hpZGRlbkNhdGVnb3JpZXMpLFxuICAgICAgYW5pbWF0aW9uRGF0YTogaXRlbS5fYW5pbWF0aW9uRGF0YSxcbiAgICAgIGxvY2tlZDogaXRlbS5fbG9ja2VkLFxuICAgIH1cbiAgfSlcbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIlxuaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuLi9jb25zb2xlXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB7IGxpc3RlblRyZWFzdXJlSHVudCB9IGZyb20gXCIuL2V4cGxvcmF0aW9uLXdhdGNoZXJcIlxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZEV4cGxvcmF0aW9uSGlzdG9yeSgpOiB2b2lkIHtcbiAgbG9hZEhpc3RvcnlCdXR0b24oKVxuICBsaXN0ZW5UcmVhc3VyZUh1bnQoKVxufVxuXG5mdW5jdGlvbiBsb2FkSGlzdG9yeUJ1dHRvbigpOiB2b2lkIHtcbiAgY29uc3QgY2xvc2VFeHBsb3JhdGlvbkJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEFuY2hvckVsZW1lbnQ+KFxuICAgIFwiI2Nsb3NlLXRyZWFzdXJlLWh1bnQtaW50ZXJmYWNlXCJcbiAgKVxuICBpZiAoIWNsb3NlRXhwbG9yYXRpb25CdXR0b24pXG4gICAgcmV0dXJuIHZvaWQgQ29uc29sZS5lcnJvcihcIkNvdWxkbid0IGZpbmQgI2Nsb3NlLXRyZWFzdXJlLWh1bnQtaW50ZXJmYWNlLlwiKVxuXG4gIGNsb3NlRXhwbG9yYXRpb25CdXR0b24uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCJcbiAgY2xvc2VFeHBsb3JhdGlvbkJ1dHRvbi5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIlxuICBjbG9zZUV4cGxvcmF0aW9uQnV0dG9uLnN0eWxlLnJpZ2h0ID0gXCIwXCJcbiAgY2xvc2VFeHBsb3JhdGlvbkJ1dHRvbi5zdHlsZS50b3AgPSBcIjBcIlxuICBjbG9zZUV4cGxvcmF0aW9uQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBvbkNsaWNrUGV0KVxuXG4gIGNvbnN0IGhpc3RvcnlCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKVxuICBoaXN0b3J5QnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJubC1idXR0b25cIiwgXCJubC1idXR0b24tYmFja1wiKVxuICBoaXN0b3J5QnV0dG9uLnN0eWxlLm1hcmdpblJpZ2h0ID0gXCIwLjZlbVwiXG4gIGhpc3RvcnlCdXR0b24udGV4dENvbnRlbnQgPSB0cmFuc2xhdGUucGV0Lmhpc3RvcnlcbiAgaGlzdG9yeUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgb25DbGlja0hpc3RvcnkpXG5cbiAgY29uc3Qgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICByb3cuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYmVmb3JlZW5kXCIsIGhpc3RvcnlCdXR0b24pXG4gIHJvdy5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJiZWZvcmVlbmRcIiwgY2xvc2VFeHBsb3JhdGlvbkJ1dHRvbilcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcIiNyaWdodC1jb250YWluZXItaW5uZXJcIilcbiAgICA/Lmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgcm93KVxufVxuXG5mdW5jdGlvbiBvbkNsaWNrSGlzdG9yeSgpOiB2b2lkIHtcbiAgaGlkZVBldCgpXG4gIGhpZGVFeHBsb3JhdGlvbigpXG4gIG1ha2VIaXN0b3J5KClcbiAgc2hvd0hpc3RvcnkoKVxufVxuXG5mdW5jdGlvbiBvbkNsaWNrUGV0KCk6IHZvaWQge1xuICBoaWRlSGlzdG9yeSgpXG4gIHNob3dQZXQoKVxufVxuXG5mdW5jdGlvbiBoaWRlUGV0KCk6IHZvaWQge1xuICBjb25zdCBuYW1lQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJuYW1lLWNvbnRhaW5lclwiKVxuICBjb25zdCBpbmZvQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpbmZvcy1jb250YWluZXJcIilcbiAgY29uc3QgcGV0SW1hZ2VDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInBldC1pbWFnZS1jb250YWluZXJcIilcblxuICBpZiAoIW5hbWVDb250YWluZXIgfHwgIWluZm9Db250YWluZXIgfHwgIXBldEltYWdlQ29udGFpbmVyKVxuICAgIHJldHVybiB2b2lkIENvbnNvbGUuZXJyb3IoXCJUaGUgcGV0IGRpc3BsYXkgd2FzIGRhbWFnZWQuXCIsIHtcbiAgICAgIG5hbWVDb250YWluZXIsXG4gICAgICBpbmZvQ29udGFpbmVyLFxuICAgICAgcGV0SW1hZ2VDb250YWluZXIsXG4gICAgfSlcblxuICBuYW1lQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxuICBpbmZvQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxuICBwZXRJbWFnZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcbn1cblxuZnVuY3Rpb24gc2hvd1BldCgpOiB2b2lkIHtcbiAgY29uc3QgbmFtZUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibmFtZS1jb250YWluZXJcIilcbiAgY29uc3QgaW5mb0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaW5mb3MtY29udGFpbmVyXCIpXG4gIGNvbnN0IHBldEltYWdlQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwZXQtaW1hZ2UtY29udGFpbmVyXCIpXG5cbiAgaWYgKCFuYW1lQ29udGFpbmVyIHx8ICFpbmZvQ29udGFpbmVyIHx8ICFwZXRJbWFnZUNvbnRhaW5lcilcbiAgICByZXR1cm4gdm9pZCBDb25zb2xlLmVycm9yKFwiVGhlIHBldCBkaXNwbGF5IHdhcyBkYW1hZ2VkLlwiLCB7XG4gICAgICBuYW1lQ29udGFpbmVyLFxuICAgICAgaW5mb0NvbnRhaW5lcixcbiAgICAgIHBldEltYWdlQ29udGFpbmVyLFxuICAgIH0pXG5cbiAgbmFtZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gXCJcIlxuICBpbmZvQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcIlwiXG4gIHBldEltYWdlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcIlwiXG59XG5cbmZ1bmN0aW9uIHNob3dIaXN0b3J5KCk6IHZvaWQge1xuICBjb25zdCBoaXN0b3J5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJoaXN0b3J5LWNvbnRhaW5lclwiKVxuICBpZiAoIWhpc3RvcnkpIHJldHVyblxuICBoaXN0b3J5LnN0eWxlLmRpc3BsYXkgPSBcIlwiXG59XG5cbmZ1bmN0aW9uIGhpZGVIaXN0b3J5KCk6IHZvaWQge1xuICBjb25zdCBoaXN0b3J5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJoaXN0b3J5LWNvbnRhaW5lclwiKVxuICBpZiAoIWhpc3RvcnkpIHJldHVyblxuICBoaXN0b3J5LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxufVxuXG5mdW5jdGlvbiBoaWRlRXhwbG9yYXRpb24oKTogdm9pZCB7XG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKFwibWFpbi1zZWN0aW9uXCIpXG4gICAgPy5jbGFzc0xpc3QucmVtb3ZlKFwidHJlYXN1cmUtaHVudC1pbnRlcmZhY2Utb3BlblwiKVxufVxuXG5mdW5jdGlvbiBtYWtlSGlzdG9yeSgpOiB2b2lkIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJoaXN0b3J5LWNvbnRhaW5lclwiKT8ucmVtb3ZlKClcbiAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2V4cGxvcmF0aW9uX2hpc3RvcnkuaHRtbFwiKVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibGVmdC1jb250YWluZXJcIik/Lmluc2VydEFkamFjZW50SFRNTChcbiAgICBcImJlZm9yZWVuZFwiLFxuICAgIHRlbXBsYXRlLnJlbmRlcih7XG4gICAgICB0cmFuc2xhdGUsXG4gICAgICBoaXN0b3J5OiBMb2NhbFN0b3JhZ2UuZXhwbG9yYXRpb25IaXN0b3J5Lm1hcChoaXN0b3J5ID0+ICh7XG4gICAgICAgIC4uLmhpc3RvcnksXG4gICAgICAgIGRhdGU6IHRyYW5zbGF0ZS5wZXQuZGF0ZV90aW1lX2Zvcm1hdC5mb3JtYXQobmV3IERhdGUoaGlzdG9yeS5kYXRlKSksXG4gICAgICB9KSksXG4gICAgfSlcbiAgKVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZGVsZXRlLWhpc3RvcnlcIik/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgTG9jYWxTdG9yYWdlLmV4cGxvcmF0aW9uSGlzdG9yeSA9IFtdXG4gICAgbWFrZUhpc3RvcnkoKVxuICB9KVxufVxuIiwiaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuLi9jb25zb2xlXCJcbmltcG9ydCB7IHRyaW1JY29uIH0gZnJvbSBcIi4uL2VsZGFyeWFfdXRpbFwiXG5pbXBvcnQgdHlwZSB7IEV4cGxvcmF0aW9uUmVzdWx0IH0gZnJvbSBcIi4uL2xvY2FsX3N0b3JhZ2UvZXhwbG9yYXRpb25fcmVzdWx0XCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuVHJlYXN1cmVIdW50KCk6IHZvaWQge1xuICBjb25zdCByZXN1bHRPdmVybGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiN0cmVhc3VyZS1odW50LXJlc3VsdC1vdmVybGF5XCIpXG4gIGlmICghcmVzdWx0T3ZlcmxheSlcbiAgICByZXR1cm4gdm9pZCBDb25zb2xlLmVycm9yKFwiVGhlcmUgaXMgbm8gcmVzdWx0IG92ZXJsYXkuXCIsIHJlc3VsdE92ZXJsYXkpXG5cbiAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgIENvbnNvbGUubG9nKFwiTXV0YXRpb24gaW5cIiwgcmVzdWx0T3ZlcmxheSlcbiAgICBpZiAoIXJlc3VsdE92ZXJsYXkuY2xhc3NMaXN0LmNvbnRhaW5zKFwiYWN0aXZlXCIpKSByZXR1cm5cblxuICAgIGNvbnN0IHJlc3VsdHMgPSBnZXRSZXN1bHRzKClcbiAgICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDApIHJldHVyblxuICAgIENvbnNvbGUubG9nKFwiUmVzdWx0czpcIiwgcmVzdWx0cylcblxuICAgIExvY2FsU3RvcmFnZS5leHBsb3JhdGlvbkhpc3RvcnkgPSBbXG4gICAgICAuLi5yZXN1bHRzLFxuICAgICAgLi4uTG9jYWxTdG9yYWdlLmV4cGxvcmF0aW9uSGlzdG9yeSxcbiAgICBdXG4gIH0pLm9ic2VydmUocmVzdWx0T3ZlcmxheSwge1xuICAgIGF0dHJpYnV0ZUZpbHRlcjogW1wiY2xhc3NcIl0sXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGdldFJlc3VsdHMoKTogRXhwbG9yYXRpb25SZXN1bHRbXSB7XG4gIGNvbnN0IGxvY2F0aW9uTmFtZSA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCIjdGgtYWdhaW4gc3Ryb25nXCIpXG4gICAgPy50ZXh0Q29udGVudD8udHJpbSgpXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcblxuICByZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLnRoLXJlc3VsdFwiKSkubWFwKHJlc3VsdCA9PiB7XG4gICAgY29uc3QgaW1nID0gcmVzdWx0LnF1ZXJ5U2VsZWN0b3I8SFRNTEltYWdlRWxlbWVudD4oXCJpbWcudGgtcmVzdWx0LWltZ1wiKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvdW50OiByZXN1bHQucXVlcnlTZWxlY3RvcihcIi5yZXNvdXJjZS1jb3VudFwiKT8udGV4dENvbnRlbnQ/LnRyaW0oKSxcbiAgICAgIGRhdGU6IG5vdyxcbiAgICAgIGljb246IGltZyA/IHRyaW1JY29uKGltZy5zcmMpIDogdW5kZWZpbmVkLFxuICAgICAgbG9jYXRpb25OYW1lLFxuICAgICAgbmFtZTogcmVzdWx0LnF1ZXJ5U2VsZWN0b3IoXCIudG9vbHRpcC1jb250ZW50IGgzXCIpPy50ZXh0Q29udGVudD8udHJpbSgpLFxuICAgICAgdHJhZGFibGU6IEJvb2xlYW4ocmVzdWx0LnF1ZXJ5U2VsZWN0b3IoXCIudHJhZGFibGVcIikpLFxuICAgIH1cbiAgfSlcbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIlxuaW1wb3J0IHsgY2hhbmdlUmVnaW9uIH0gZnJvbSBcIi4uL2FqYXgvY2hhbmdlX3JlZ2lvblwiXG5pbXBvcnQgeyBSZXN1bHQgfSBmcm9tIFwiLi4vYXBpL3Jlc3VsdC5lbnVtXCJcbmltcG9ydCB7IENvbnNvbGUgfSBmcm9tIFwiLi4vY29uc29sZVwiXG5pbXBvcnQgdHlwZSB7IE1hcFJlZ2lvbiB9IGZyb20gXCIuLi9lbGRhcnlhL2N1cnJlbnRfcmVnaW9uXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgdHlwZSB7IEF1dG9FeHBsb3JlTG9jYXRpb24gfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9hdXRvX2V4cGxvcmVfbG9jYXRpb25cIlxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlIH0gZnJvbSBcIi4uL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiXG5pbXBvcnQgdHlwZSB7IEF1dG9FeHBsb3JlQnV0dG9uIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2F1dG9fZXhwbG9yZV9idXR0b25cIlxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZE1hcmtlcnMoKTogdm9pZCB7XG4gIGNvbnN0IGF1dG9FeHBsb3JlTG9jYXRpb25zID0gTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zXG5cbiAgZm9yIChjb25zdCBkaXYgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRGl2RWxlbWVudD4oXG4gICAgXCIubWFwLWxvY2F0aW9uW2RhdGEtaWRdXCJcbiAgKSkge1xuICAgIGNvbnN0IGxvY2F0aW9uSWQgPSBOdW1iZXIoZGl2LmdldEF0dHJpYnV0ZShcImRhdGEtaWRcIikpXG4gICAgaWYgKCFsb2NhdGlvbklkKSBjb250aW51ZVxuXG4gICAgbG9hZFBpY3RvTWFwKGF1dG9FeHBsb3JlTG9jYXRpb25zLCBkaXYpXG5cbiAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+XG4gICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihcbiAgICAgICAgKF86IE11dGF0aW9uUmVjb3JkW10sIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyKTogdm9pZCA9PiB7XG4gICAgICAgICAgYWRkQXV0b0V4cGxvcmVCdXR0b24obG9jYXRpb25JZCwgb2JzZXJ2ZXIpXG4gICAgICAgIH1cbiAgICAgICkub2JzZXJ2ZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1hcC1sb2NhdGlvbi1wcmV2aWV3XCIpIGFzIE5vZGUsIHtcbiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgIH0pXG4gICAgKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEF1dG9FeHBsb3JlQnV0dG9uKFxuICBsb2NhdGlvbklkOiBudW1iZXIsXG4gIG9ic2VydmVyPzogTXV0YXRpb25PYnNlcnZlclxuKTogdm9pZCB7XG4gIGNvbnN0IGJ1dHRvbnNDb250YWluZXIgPVxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFwiI2J1dHRvbnMtY29udGFpbmVyXCIpXG4gIGlmICghYnV0dG9uc0NvbnRhaW5lcikgcmV0dXJuXG4gIG9ic2VydmVyPy5kaXNjb25uZWN0KClcblxuICAvLyBQYXJhbWV0ZXJzIHRvIGJlIGluamVjdGVkIGludG8gdGhlIHRlbXBsYXRlXG4gIGNvbnN0IGNvbnRleHQ6IEF1dG9FeHBsb3JlQnV0dG9uID0ge1xuICAgIGxvY2F0aW9uSWQsXG4gICAgYWN0aXZlOiBMb2NhbFN0b3JhZ2UuYXV0b0V4cGxvcmVMb2NhdGlvbnMuc29tZShcbiAgICAgIHNhdmVkID0+IHNhdmVkLmxvY2F0aW9uLmlkID09PSBsb2NhdGlvbklkXG4gICAgKSxcbiAgICByZWdpb25JZDogTnVtYmVyKFxuICAgICAgZG9jdW1lbnRcbiAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoXCIubWluaW1hcC5jdXJyZW50W2RhdGEtbWFwaWRdXCIpXG4gICAgICAgID8uZ2V0QXR0cmlidXRlKFwiZGF0YS1tYXBpZFwiKVxuICAgICksXG4gIH1cblxuICAvLyBBZGQgdGhlIGF1dG8gZXhwbG9yZSBidXR0b25cbiAgYnV0dG9uc0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiI2F1dG8tZXhwbG9yZS1idXR0b25cIik/LnJlbW92ZSgpXG4gIGNvbnN0IGF1dG9FeHBsb3JlVGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2F1dG9fZXhwbG9yZV9idXR0b24uaHRtbFwiKVxuICBidXR0b25zQ29udGFpbmVyLmluc2VydEFkamFjZW50SFRNTChcbiAgICBcImJlZm9yZWVuZFwiLFxuICAgIGF1dG9FeHBsb3JlVGVtcGxhdGUucmVuZGVyKHsgLi4uY29udGV4dCwgdHJhbnNsYXRlIH0pXG4gIClcblxuICAvLyBCaW5kIGBhdXRvRXhwbG9yZWAgYW5kIGBsb2FkUGljdG9NYXBzYFxuICBidXR0b25zQ29udGFpbmVyXG4gICAgLnF1ZXJ5U2VsZWN0b3I8SFRNTEJ1dHRvbkVsZW1lbnQ+KFwiI2F1dG8tZXhwbG9yZS1idXR0b25cIilcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICBDb25zb2xlLmRlYnVnKFwiQ2xpY2tlZCBvbiAjYXV0by1leHBsb3JlLWJ1dHRvbi5cIiwgY29udGV4dClcbiAgICAgIHZvaWQgbWFya0xvY2F0aW9uKGNvbnRleHQpLnRoZW4obG9hZFBpY3RvTWFwcylcbiAgICB9KVxuXG4gIHZvaWQgZGlzYWJsZUV4cGxvcmUoY29udGV4dClcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGlzYWJsZUV4cGxvcmUoY29udGV4dDogQXV0b0V4cGxvcmVCdXR0b24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZW50cnkgPSBhd2FpdCBnZXRBdXRvRXhwbG9yZUVudHJ5KGNvbnRleHQucmVnaW9uSWQsIGNvbnRleHQubG9jYXRpb25JZClcbiAgaWYgKCFlbnRyeSkgcmV0dXJuXG5cbiAgaWYgKHBldEVuZXJneSA8IE51bWJlcihlbnRyeS5sb2NhdGlvbi5lbmVyZ3lSZXF1aXJlZCkpXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJleHBsb3JlLWJ1dHRvblwiKT8uY2xhc3NMaXN0LmFkZChcImRpc2FibGVkXCIpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1hcmtMb2NhdGlvbihjb250ZXh0OiBBdXRvRXhwbG9yZUJ1dHRvbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoY29udGV4dC5hY3RpdmUpIHtcbiAgICBjb25zdCBmaWx0ZXJlZExvY2F0aW9ucyA9IExvY2FsU3RvcmFnZS5hdXRvRXhwbG9yZUxvY2F0aW9ucy5maWx0ZXIoXG4gICAgICBzYXZlZCA9PiBzYXZlZC5sb2NhdGlvbi5pZCAhPT0gY29udGV4dC5sb2NhdGlvbklkXG4gICAgKVxuICAgIExvY2FsU3RvcmFnZS5hdXRvRXhwbG9yZUxvY2F0aW9ucyA9IGZpbHRlcmVkTG9jYXRpb25zXG4gICAgYWRkQXV0b0V4cGxvcmVCdXR0b24oY29udGV4dC5sb2NhdGlvbklkKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbmV3QXV0b0V4cGxvcmUgPSBhd2FpdCBnZXRBdXRvRXhwbG9yZUVudHJ5KFxuICAgIGNvbnRleHQucmVnaW9uSWQsXG4gICAgY29udGV4dC5sb2NhdGlvbklkXG4gIClcbiAgaWYgKCFuZXdBdXRvRXhwbG9yZSkge1xuICAgIENvbnNvbGUuZXJyb3IoXG4gICAgICBgQ291bGQgbm90IGdlbmVyYXRlIGFuIGF1dG8gZXhwbG9yZSBlbnRyeSBmb3IgbG9jYXRpb24gIyR7Y29udGV4dC5sb2NhdGlvbklkfS5gLFxuICAgICAgY29udGV4dFxuICAgIClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG5ld0xvY2F0aW9ucyA9IExvY2FsU3RvcmFnZS5hdXRvRXhwbG9yZUxvY2F0aW9uc1xuICBuZXdMb2NhdGlvbnMucHVzaChuZXdBdXRvRXhwbG9yZSlcbiAgTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zID0gbmV3TG9jYXRpb25zXG4gIGFkZEF1dG9FeHBsb3JlQnV0dG9uKGNvbnRleHQubG9jYXRpb25JZClcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXV0b0V4cGxvcmVFbnRyeShcbiAgcmVnaW9uSWQ6IG51bWJlcixcbiAgbG9jYXRpb25JZDogbnVtYmVyXG4pOiBQcm9taXNlPEF1dG9FeHBsb3JlTG9jYXRpb24gfCBudWxsPiB7XG4gIGNvbnN0IHJlZ2lvbiA9IGF3YWl0IGdldFJlZ2lvbihyZWdpb25JZClcbiAgaWYgKCFyZWdpb24pIHtcbiAgICBDb25zb2xlLmVycm9yKGBDb3VsZCBub3QgZ2V0IHJlZ2lvbiAjJHtyZWdpb25JZH0uYClcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZWdpb24ubG9jYXRpb25zLmZpbmQobG9jYXRpb24gPT4gbG9jYXRpb24uaWQgPT09IGxvY2F0aW9uSWQpXG4gIGlmICghbG9jYXRpb24pIHtcbiAgICBDb25zb2xlLmVycm9yKFxuICAgICAgYENvdWxkIG5vdCBnZXQgbG9jYXRpb24gIyR7bG9jYXRpb25JZH0gaW4gJHtyZWdpb24ubmFtZX0uYCxcbiAgICAgIHJlZ2lvblxuICAgIClcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBsb2NhdGlvbixcbiAgICByZWdpb24sXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVnaW9uKGlkOiBudW1iZXIpOiBQcm9taXNlPE1hcFJlZ2lvbiB8IG51bGw+IHtcbiAgaWYgKGlkLnRvU3RyaW5nKCkgPT09IGN1cnJlbnRSZWdpb24uaWQpIHJldHVybiBjdXJyZW50UmVnaW9uXG5cbiAgY29uc3QganNvbiA9IGF3YWl0IGNoYW5nZVJlZ2lvbihpZClcbiAgaWYgKGpzb24ucmVzdWx0ID09PSBSZXN1bHQuc3VjY2VzcykgcmV0dXJuIGpzb24uZGF0YS5jdXJyZW50UmVnaW9uXG5cbiAgcmV0dXJuIG51bGxcbn1cblxuLy8gUGljdG8gbWFwXG5cbmZ1bmN0aW9uIGxvYWRQaWN0b01hcHMoKTogdm9pZCB7XG4gIGNvbnN0IGF1dG9FeHBsb3JlTG9jYXRpb25zID0gTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zXG4gIGZvciAoY29uc3QgZGl2IG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTERpdkVsZW1lbnQ+KFxuICAgIFwiLm1hcC1sb2NhdGlvbltkYXRhLWlkXVwiXG4gICkpIHtcbiAgICBsb2FkUGljdG9NYXAoYXV0b0V4cGxvcmVMb2NhdGlvbnMsIGRpdilcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2FkUGljdG9NYXAoXG4gIGF1dG9FeHBsb3JlTG9jYXRpb25zOiBBdXRvRXhwbG9yZUxvY2F0aW9uW10sXG4gIGRpdjogSFRNTERpdkVsZW1lbnRcbik6IHZvaWQge1xuICBjb25zdCBtYXBMb2NhdGlvbiA9IGRpdi5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkXCIpXG4gIGlmICghbWFwTG9jYXRpb24pIHJldHVyblxuXG4gIGRpdi5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBhdXRvRXhwbG9yZUxvY2F0aW9ucy5zb21lKFxuICAgIHNhdmVkID0+IHNhdmVkLmxvY2F0aW9uLmlkID09PSBOdW1iZXIobWFwTG9jYXRpb24pXG4gIClcbiAgICA/IFwidXJsKC9zdGF0aWMvaW1nL25ldy1sYXlvdXQvcGV0L2ljb25zL3BpY3RvX21hcF9leHBsby5wbmcpXCJcbiAgICA6IFwidXJsKC9zdGF0aWMvaW1nL25ldy1sYXlvdXQvcGV0L2ljb25zL3BpY3RvX21hcC5wbmcpXCJcbn1cbiIsImV4cG9ydCBlbnVtIFNlc3Npb25TdG9yYWdlS2V5IHtcbiAgYWN0aW9uID0gXCJhY3Rpb25cIixcbiAgZXhwbG9yYXRpb25zRG9uZSA9IFwiZXhwbG9yYXRpb25zRG9uZVwiLFxuICBtaW5pZ2FtZXNEb25lID0gXCJtaW5pZ2FtZXNEb25lXCIsXG4gIHNlbGVjdGVkTG9jYXRpb24gPSBcInNlbGVjdGVkTG9jYXRpb25cIixcbiAgdGFrZW92ZXIgPSBcInRha2VvdmVyXCIsXG4gIHdpc2hsaXN0ID0gXCJ3aXNobGlzdFwiLFxuICBzdW1tZXJHYW1lRG9uZSA9IFwic3VtbWVyR2FtZURvbmVcIixcbn1cbiIsImltcG9ydCB0eXBlIHsgQXV0b0V4cGxvcmVMb2NhdGlvbiB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2F1dG9fZXhwbG9yZV9sb2NhdGlvblwiXG5pbXBvcnQgdHlwZSB7IFdpc2hlZEl0ZW0gfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS93aXNoZWRfaXRlbVwiXG5pbXBvcnQgeyBTZXNzaW9uU3RvcmFnZUtleSB9IGZyb20gXCIuL3Nlc3Npb25fc3RvcmFnZS5lbnVtXCJcbmltcG9ydCB0eXBlIHsgVGFrZW92ZXJBY3Rpb24gfSBmcm9tIFwiLi90YWtlb3Zlcl9hY3Rpb24uZW51bVwiXG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uU3RvcmFnZSB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHNlc3Npb25TdG9yYWdlID0gc2Vzc2lvblN0b3JhZ2VcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgZ2V0IGFjdGlvbigpOiBUYWtlb3ZlckFjdGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW0oU2Vzc2lvblN0b3JhZ2VLZXkuYWN0aW9uLCBudWxsKVxuICB9XG5cbiAgc3RhdGljIHNldCBhY3Rpb24oYWN0aW9uOiBUYWtlb3ZlckFjdGlvbiB8IG51bGwpIHtcbiAgICB0aGlzLnNldEl0ZW0oU2Vzc2lvblN0b3JhZ2VLZXkuYWN0aW9uLCBhY3Rpb24pXG4gIH1cblxuICBzdGF0aWMgZ2V0IGV4cGxvcmF0aW9uc0RvbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbShTZXNzaW9uU3RvcmFnZUtleS5leHBsb3JhdGlvbnNEb25lLCBmYWxzZSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgZXhwbG9yYXRpb25zRG9uZShkb25lOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5LmV4cGxvcmF0aW9uc0RvbmUsIGRvbmUpXG4gIH1cblxuICBzdGF0aWMgZ2V0IG1pbmlnYW1lc0RvbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbShTZXNzaW9uU3RvcmFnZUtleS5taW5pZ2FtZXNEb25lLCBmYWxzZSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgbWluaWdhbWVzRG9uZShkb25lOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5Lm1pbmlnYW1lc0RvbmUsIGRvbmUpXG4gIH1cblxuICBzdGF0aWMgZ2V0IHN1bW1lckdhbWVEb25lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW0oU2Vzc2lvblN0b3JhZ2VLZXkuc3VtbWVyR2FtZURvbmUsIGZhbHNlKVxuICB9XG5cbiAgc3RhdGljIHNldCBzdW1tZXJHYW1lRG9uZShkb25lOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5LnN1bW1lckdhbWVEb25lLCBkb25lKVxuICB9XG5cbiAgc3RhdGljIGdldCBzZWxlY3RlZExvY2F0aW9uKCk6IEF1dG9FeHBsb3JlTG9jYXRpb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5LnNlbGVjdGVkTG9jYXRpb24sIG51bGwpXG4gIH1cblxuICBzdGF0aWMgc2V0IHNlbGVjdGVkTG9jYXRpb24oc2VsZWN0ZWQ6IEF1dG9FeHBsb3JlTG9jYXRpb24gfCBudWxsKSB7XG4gICAgdGhpcy5zZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5LnNlbGVjdGVkTG9jYXRpb24sIHNlbGVjdGVkKVxuICB9XG5cbiAgc3RhdGljIGdldCB0YWtlb3ZlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5LnRha2VvdmVyLCBmYWxzZSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgdGFrZW92ZXIoZW5hYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0SXRlbShTZXNzaW9uU3RvcmFnZUtleS50YWtlb3ZlciwgZW5hYmxlZClcbiAgfVxuXG4gIHN0YXRpYyBnZXQgd2lzaGxpc3QoKTogV2lzaGVkSXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtKFNlc3Npb25TdG9yYWdlS2V5Lndpc2hsaXN0LCBbXSlcbiAgfVxuXG4gIHN0YXRpYyBzZXQgd2lzaGxpc3Qod2lzaGxpc3Q6IFdpc2hlZEl0ZW1bXSkge1xuICAgIHRoaXMuc2V0SXRlbShTZXNzaW9uU3RvcmFnZUtleS53aXNobGlzdCwgd2lzaGxpc3QpXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRJdGVtPFQ+KGtleTogU2Vzc2lvblN0b3JhZ2VLZXksIGZhbGxiYWNrOiBUKTogVCB7XG4gICAgcmV0dXJuIChKU09OLnBhcnNlKFxuICAgICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGtleSkgPz8gSlNPTi5zdHJpbmdpZnkoZmFsbGJhY2spXG4gICAgKSA/PyBmYWxsYmFjaykgYXMgVFxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2V0SXRlbTxUPihrZXk6IFNlc3Npb25TdG9yYWdlS2V5LCB2YWx1ZTogVCk6IHZvaWQge1xuICAgIHRoaXMuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gVGFrZW92ZXJBY3Rpb24ge1xuICBkYWlseSA9IFwiZGFpbHlcIixcbiAgbWluaWdhbWVzID0gXCJtaW5pZ2FtZXNcIixcbiAgZXhwbG9yYXRpb25zID0gXCJleHBsb3JhdGlvbnNcIixcbiAgYXVjdGlvbnMgPSBcImF1Y3Rpb25zXCIsXG4gIGJ1eSA9IFwiYnV5XCIsXG4gIC8vIHNlbGwsXG4gIHN1bW1lckdhbWUgPSBcInN1bW1lckdhbWVcIixcbiAgd2FpdCA9IFwid2FpdFwiLFxufVxuIiwiaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuLi9jb25zb2xlXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB7IFNlc3Npb25TdG9yYWdlIH0gZnJvbSBcIi4uL3Nlc3Npb25fc3RvcmFnZS9zZXNzaW9uX3N0b3JhZ2VcIlxuaW1wb3J0IHR5cGUgeyBUYWtlb3ZlckFjdGlvbiB9IGZyb20gXCIuLi9zZXNzaW9uX3N0b3JhZ2UvdGFrZW92ZXJfYWN0aW9uLmVudW1cIlxuaW1wb3J0IHsgbG9hZFRvcEJhciB9IGZyb20gXCIuLi91aS90b3BfYmFyXCJcbmltcG9ydCB0eXBlIHsgQWN0aW9uIH0gZnJvbSBcIi4vY2xhc3Nlcy9hY3Rpb25cIlxuaW1wb3J0IGJ1eUFjdGlvbiBmcm9tIFwiLi9jbGFzc2VzL2J1eV9hY3Rpb25cIlxuaW1wb3J0IGRhaWx5QWN0aW9uIGZyb20gXCIuL2NsYXNzZXMvZGFpbHlfYWN0aW9uXCJcbmltcG9ydCBleHBsb3JhdGlvbkFjdGlvbiBmcm9tIFwiLi9jbGFzc2VzL2V4cGxvcmF0aW9uX2FjdGlvblwiXG5pbXBvcnQgbWluaWdhbWVBY3Rpb24gZnJvbSBcIi4vY2xhc3Nlcy9taW5pZ2FtZV9hY3Rpb25cIlxuaW1wb3J0IHsgc3VtbWVyR2FtZUFjdGlvbiB9IGZyb20gXCIuL2NsYXNzZXMvc3VtbWVyX2dhbWVfYWN0aW9uXCJcbmltcG9ydCB3YWl0QWN0aW9uIGZyb20gXCIuL2NsYXNzZXMvd2FpdF9hY3Rpb25cIlxuXG4vKiogQXV0b21hdGVkIGVudHJ5IHBvaW50IG9mIHRoZSB0YWtlb3Zlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkVGFrZW92ZXIoKTogdm9pZCB7XG4gIGlmIChTZXNzaW9uU3RvcmFnZS50YWtlb3ZlciAmJiBMb2NhbFN0b3JhZ2UudW5sb2NrZWQpIHZvaWQgdGFrZW92ZXIoKVxufVxuXG4vKiogTWFudWFsIGVudHJ5IHBvaW50IG9mIHRoZSB0YWtlb3Zlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2dnbGVUYWtlb3ZlcigpOiB2b2lkIHtcbiAgcmVzZXRUYWtlb3ZlcigpXG4gIFNlc3Npb25TdG9yYWdlLnRha2VvdmVyID0gIVNlc3Npb25TdG9yYWdlLnRha2VvdmVyXG5cbiAgaWYgKCFMb2NhbFN0b3JhZ2UudW5sb2NrZWQpIHtcbiAgICBTZXNzaW9uU3RvcmFnZS50YWtlb3ZlciA9IGZhbHNlXG4gICAgcmV0dXJuXG4gIH1cblxuICBsb2FkVG9wQmFyKClcbiAgaWYgKFNlc3Npb25TdG9yYWdlLnRha2VvdmVyKSAkLmZsYXZyTm90aWYodHJhbnNsYXRlLnRha2VvdmVyLmVuYWJsZWQpXG4gIGVsc2UgJC5mbGF2ck5vdGlmKHRyYW5zbGF0ZS50YWtlb3Zlci5kaXNhYmxlZClcblxuICB2b2lkIHRha2VvdmVyKClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0VGFrZW92ZXIoKTogdm9pZCB7XG4gIFNlc3Npb25TdG9yYWdlLmFjdGlvbiA9IG51bGxcbiAgU2Vzc2lvblN0b3JhZ2UuZXhwbG9yYXRpb25zRG9uZSA9IGZhbHNlXG4gIFNlc3Npb25TdG9yYWdlLm1pbmlnYW1lc0RvbmUgPSBmYWxzZVxuICBTZXNzaW9uU3RvcmFnZS5zZWxlY3RlZExvY2F0aW9uID0gbnVsbFxuICBTZXNzaW9uU3RvcmFnZS5zdW1tZXJHYW1lRG9uZSA9IGZhbHNlXG4gIFNlc3Npb25TdG9yYWdlLndpc2hsaXN0ID0gW11cbn1cblxuYXN5bmMgZnVuY3Rpb24gdGFrZW92ZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghU2Vzc2lvblN0b3JhZ2UudGFrZW92ZXIpIHJldHVyblxuICBpZiAoZGFpbHlBY3Rpb24uY29uZGl0aW9uKCkpIGF3YWl0IGRhaWx5QWN0aW9uLnBlcmZvcm0oKVxuXG4gIGNvbnN0IGFjdGlvbiA9IGFjdGlvbnMuZmluZChhY3Rpb24gPT4gYWN0aW9uLmtleSA9PT0gU2Vzc2lvblN0b3JhZ2UuYWN0aW9uKVxuICBpZiAoYWN0aW9uPy5jb25kaXRpb24oKSkge1xuICAgIENvbnNvbGUuaW5mbyhcIkFjdGlvbjpcIiwgYWN0aW9uLmtleSlcblxuICAgIGlmIChhd2FpdCBhY3Rpb24ucGVyZm9ybSgpKSByZXR1cm5cbiAgfVxuXG4gIGNoYW5nZUFjdGlvbigpXG4gIHZvaWQgdGFrZW92ZXIoKVxufVxuXG5jb25zdCBhY3Rpb25zOiBBY3Rpb25bXSA9IFtcbiAgZXhwbG9yYXRpb25BY3Rpb24sXG4gIGJ1eUFjdGlvbixcbiAgbWluaWdhbWVBY3Rpb24sXG4gIHN1bW1lckdhbWVBY3Rpb24sXG4gIHdhaXRBY3Rpb24sXG5dXG5cbmZ1bmN0aW9uIGNoYW5nZUFjdGlvbigpOiBUYWtlb3ZlckFjdGlvbiB7XG4gIGNvbnN0IG5leHQgPVxuICAgIGFjdGlvbnMuZmluZEluZGV4KGFjdGlvbiA9PiBhY3Rpb24ua2V5ID09PSBTZXNzaW9uU3RvcmFnZS5hY3Rpb24pICsgMVxuXG4gIHJldHVybiAoU2Vzc2lvblN0b3JhZ2UuYWN0aW9uID1cbiAgICBhY3Rpb25zW25leHQgPj0gYWN0aW9ucy5sZW5ndGggPyAwIDogbmV4dF0hLmtleSlcbn1cbiIsImltcG9ydCB0eXBlIHsgVGFrZW92ZXJBY3Rpb24gfSBmcm9tIFwiLi4vLi4vc2Vzc2lvbl9zdG9yYWdlL3Rha2VvdmVyX2FjdGlvbi5lbnVtXCJcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFjdGlvbiB7XG4gIC8qKiBLZXkgYnkgd2hpY2ggdGhlIGBTZXNzaW9uU3RvcmFnZWAgY2FuIHJlZmVyZW5jZSB0aGlzIGFjdGlvbi4gKi9cbiAgYWJzdHJhY3QgcmVhZG9ubHkga2V5OiBUYWtlb3ZlckFjdGlvblxuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIHRoaXMgYWN0aW9uIGNhbiBiZSBwZXJmb3JtZWQgZHVyaW5nIGEgdGFrZW92ZXIuICovXG4gIGFic3RyYWN0IGNvbmRpdGlvbigpOiBib29sZWFuXG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIHRoZSBhY3Rpb24gYW5kIHJldHVybnMgYHRydWVgIGlmIGl0IGhhcyBzb21ldGhpbmcgZWxzZSB0byBkbyBvclxuICAgKiBgZmFsc2VgIGlmIHRoaXMgYWN0aW9uIGlzIGZpbmlzaGVkIGV4ZWN1dGluZy5cbiAgICovXG4gIGFic3RyYWN0IHBlcmZvcm0oKTogUHJvbWlzZTxib29sZWFuPlxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyBhamF4U2VhcmNoIH0gZnJvbSBcIi4uLy4uL2FqYXgvYWpheF9zZWFyY2hcIlxuaW1wb3J0IHsgYnV5IH0gZnJvbSBcIi4uLy4uL2FqYXgvYnV5XCJcbmltcG9ydCB7IENvbnNvbGUgfSBmcm9tIFwiLi4vLi4vY29uc29sZVwiXG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiXG5pbXBvcnQgdHlwZSB7IFdpc2hlZEl0ZW0gfSBmcm9tIFwiLi4vLi4vbG9jYWxfc3RvcmFnZS93aXNoZWRfaXRlbVwiXG5pbXBvcnQgdHlwZSB7IE1hcmtldEVudHJ5IH0gZnJvbSBcIi4uLy4uL21hcmtldHBsYWNlL2ludGVyZmFjZXMvbWFya2V0X2VudHJ5XCJcbmltcG9ydCB7IGdldEl0ZW1EZXRhaWxzIH0gZnJvbSBcIi4uLy4uL21hcmtldHBsYWNlL21hcmtldHBsYWNlX2hhbmRsZXJzXCJcbmltcG9ydCB7IFRha2VvdmVyQWN0aW9uIH0gZnJvbSBcIi4uLy4uL3Nlc3Npb25fc3RvcmFnZS90YWtlb3Zlcl9hY3Rpb24uZW51bVwiXG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi9hY3Rpb25cIlxuXG5jbGFzcyBCdXlBY3Rpb24gZXh0ZW5kcyBBY3Rpb24ge1xuICByZWFkb25seSBrZXkgPSBUYWtlb3ZlckFjdGlvbi5idXlcblxuICBwcml2YXRlIGdldCBjdXJyZW50TWFhbmEoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTnVtYmVyKFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQW5jaG9yRWxlbWVudD4oXCIjY3VycmVuY3ktbWFhbmFcIik/LmRhdGFzZXRcbiAgICAgICAgLm1hYW5hXG4gICAgKVxuICB9XG5cbiAgY29uZGl0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBMb2NhbFN0b3JhZ2UubWFya2V0ICYmIEJvb2xlYW4oTG9jYWxTdG9yYWdlLndpc2hsaXN0Lmxlbmd0aClcbiAgfVxuXG4gIGFzeW5jIHBlcmZvcm0oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGxvY2F0aW9uLnBhdGhuYW1lICE9PSBcIi9tYXJrZXRwbGFjZVwiKSB7XG4gICAgICBwYWdlTG9hZChcIi9tYXJrZXRwbGFjZVwiKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBjb25zdCBpY29uTWVzc2FnZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2h0bWwvZmxhdnJfbm90aWYvaWNvbl9tZXNzYWdlLmh0bWxcIilcbiAgICBmb3IgKGNvbnN0IHdpc2hlZCBvZiBMb2NhbFN0b3JhZ2Uud2lzaGxpc3QpIHtcbiAgICAgIC8vIENsb3RoZXMgbWlnaHQgYmUgYSBzcGVjaWFsIGV4Y2VwdGlvbi4gSWYgdGhleSBhcmUsIHRoZW4gY2hlY2sgZm9yXG4gICAgICAvLyBgd2lzaGVkLnR5cGUgPT09IFR5cGUuUGxheWVyV2VhcmFibGVJdGVtYC5cbiAgICAgIGlmICh3aXNoZWQuZXJyb3IpIHtcbiAgICAgICAgQ29uc29sZS53YXJuKGBTa2lwcGVkIFwiJHt3aXNoZWQubmFtZX1cImAsIHdpc2hlZClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIENvbnNvbGUuaW5mbyhgU2VhcmNoaW5nIGZvciBcIiR7d2lzaGVkLm5hbWV9XCJgLCB3aXNoZWQpXG5cbiAgICAgIC8qKiBTZWFyY2ggaW4gZWFjaCBwYWdlcyB1bnRpbCB0aGUgYW1vdW50IG9mIGl0ZW1zIGlzIGxlc3MgdGhhbiA4ICovXG4gICAgICBsZXQgYW1vdW50ID0gOFxuICAgICAgZm9ycGFnZTogZm9yIChsZXQgcGFnZSA9IDE7IGFtb3VudCA9PT0gODsgcGFnZSsrKSB7XG4gICAgICAgIGxldCByZXN1bHRzOiBNYXJrZXRFbnRyeVtdID0gW11cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXN1bHRzID0gYXdhaXQgdGhpcy5zZWFyY2god2lzaGVkLCBwYWdlKVxuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBlIGFzIEpRdWVyeVhIUlxuICAgICAgICAgIENvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBzZWFyY2ggZm9yIFwiJHt3aXNoZWQubmFtZX1cImAsIGVycm9yKVxuICAgICAgICAgIHRoaXMuc2V0RXJyb3Iod2lzaGVkLmljb24sIGAke2Vycm9yLnN0YXR1c1RleHR9YClcbiAgICAgICAgICBicmVhayBmb3JwYWdlXG4gICAgICAgIH1cblxuICAgICAgICBhbW91bnQgPSByZXN1bHRzLmxlbmd0aFxuICAgICAgICBDb25zb2xlLmxvZyhgRm91bmQgJHthbW91bnR9IHJlc3VsdHNgLCByZXN1bHRzKVxuXG4gICAgICAgIGNvbnN0IHdhbnRlZCA9IHJlc3VsdHMuZmlsdGVyKFxuICAgICAgICAgIHJlc3VsdCA9PlxuICAgICAgICAgICAgcmVzdWx0Lmljb24gPT09IHdpc2hlZC5pY29uICYmXG4gICAgICAgICAgICByZXN1bHQuYnV5Tm93UHJpY2UgJiZcbiAgICAgICAgICAgIE51bWJlcihyZXN1bHQuYnV5Tm93UHJpY2UucHJpY2UpIDw9IHdpc2hlZC5wcmljZSAmJlxuICAgICAgICAgICAgTnVtYmVyKHJlc3VsdC5idXlOb3dQcmljZS5wcmljZSkgPD0gdGhpcy5jdXJyZW50TWFhbmFcbiAgICAgICAgKVxuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiB3YW50ZWQpIHtcbiAgICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmJ1eShyZXN1bHQpKSkgYnJlYWsgZm9ycGFnZVxuXG4gICAgICAgICAgTG9jYWxTdG9yYWdlLnB1cmNoYXNlcyA9IFtcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIC4uLkxvY2FsU3RvcmFnZS5wdXJjaGFzZXMuZmlsdGVyKFxuICAgICAgICAgICAgICBwdXJjaGFzZSA9PiBwdXJjaGFzZS5pdGVtaWQgIT09IHJlc3VsdC5pdGVtaWRcbiAgICAgICAgICAgICksXG4gICAgICAgICAgXVxuXG4gICAgICAgICAgQ29uc29sZS5pbmZvKFxuICAgICAgICAgICAgYEJvdWdodCBcIiR7cmVzdWx0Lm5hbWV9XCIgZm9yICR7TnVtYmVyKFxuICAgICAgICAgICAgICByZXN1bHQuYnV5Tm93UHJpY2U/LnByaWNlXG4gICAgICAgICAgICApfSBtYWFuYXMuYCxcbiAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgIClcblxuICAgICAgICAgICQuZmxhdnJOb3RpZihcbiAgICAgICAgICAgIGljb25NZXNzYWdlLnJlbmRlcih7XG4gICAgICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogdHJhbnNsYXRlLnRha2VvdmVyLmJvdWdodChcbiAgICAgICAgICAgICAgICByZXN1bHQubmFtZSxcbiAgICAgICAgICAgICAgICBOdW1iZXIocmVzdWx0LmJ1eU5vd1ByaWNlPy5wcmljZSlcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUHVyY2hhc2UgYW4gaXRlbSBmcm9tIHRoZSBtYXJrZXQuXG4gICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIGl0ZW0gd2FzIHN1Y2Nlc3NmdWxseSBwdXJjaGFzZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJ1eShyZXN1bHQ6IE1hcmtldEVudHJ5KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IGJ1eShOdW1iZXIocmVzdWx0Lml0ZW1pZCkpXG4gICAgaWYgKGpzb24ucmVzdWx0ICE9PSBcInN1Y2Nlc3NcIikgdGhpcy5zZXRFcnJvcihyZXN1bHQuaWNvbiwganNvbi5kYXRhKVxuICAgIHJldHVybiBqc29uLnJlc3VsdCA9PT0gXCJzdWNjZXNzXCJcbiAgfVxuXG4gIC8qKiBTZWFyY2ggZm9yIGEgd2lzaGVkIGl0ZW0gb24gYSBzcGVjaWZpYyBwYWdlIHVzaW5nIHRoZSBpdGVtJ3MgbmFtZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBzZWFyY2god2lzaGVkOiBXaXNoZWRJdGVtLCBwYWdlID0gMSk6IFByb21pc2U8TWFya2V0RW50cnlbXT4ge1xuICAgIC8vIFB1dCB0aGUgbmFtZSBvZiB0aGUgaXRlbSBpbiB0aGUgZmlsdGVyXG4gICAgY29uc3QgZmlsdGVySXRlbU5hbWUgPVxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PihcIiNmaWx0ZXItaXRlbU5hbWVcIilcbiAgICBpZiAoZmlsdGVySXRlbU5hbWUpIGZpbHRlckl0ZW1OYW1lLnZhbHVlID0gd2lzaGVkLm5hbWVcblxuICAgIC8vIFNob3cgdGhlIHJlc3VsdHMgb2YgdGhlIHNlYXJjaFxuICAgIGNvbnN0IG1hcmtldHBsYWNlU2VhcmNoSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgXCIubWFya2V0cGxhY2Utc2VhcmNoLWl0ZW1zXCJcbiAgICApXG4gICAgaWYgKCFtYXJrZXRwbGFjZVNlYXJjaEl0ZW1zKSByZXR1cm4gW11cbiAgICBtYXJrZXRwbGFjZVNlYXJjaEl0ZW1zLmlubmVySFRNTCA9IGF3YWl0IGFqYXhTZWFyY2goe1xuICAgICAgbmFtZTogd2lzaGVkLm5hbWUsXG4gICAgICBwYWdlLFxuICAgIH0pXG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgIG1hcmtldHBsYWNlU2VhcmNoSXRlbXMucXVlcnlTZWxlY3RvckFsbDxIVE1MTElFbGVtZW50PihcbiAgICAgICAgXCIubWFya2V0cGxhY2Utc2VhcmNoLWl0ZW1cIlxuICAgICAgKVxuICAgIClcbiAgICAgIC5tYXAoZ2V0SXRlbURldGFpbHMpXG4gICAgICAuZmlsdGVyPE1hcmtldEVudHJ5PigoaXRlbSk6IGl0ZW0gaXMgTWFya2V0RW50cnkgPT4gaXRlbSAhPT0gbnVsbClcbiAgfVxuXG4gIC8qKiBTZXQgdGhlIGBXaXNoZWRJdGVtLmVycm9yYCBwcm9wZXJ0eSB3aXRob3V0IHJlb3JkZXJpbmcgdGhlIHdpc2hsaXN0LiAqL1xuICBwcml2YXRlIHNldEVycm9yKGljb246IHN0cmluZywgZXJyb3I6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHdpc2hsaXN0ID0gTG9jYWxTdG9yYWdlLndpc2hsaXN0XG4gICAgY29uc3QgaW5kZXggPSB3aXNobGlzdC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLmljb24gPT09IGljb24pXG4gICAgY29uc3QgZW50cnkgPSB3aXNobGlzdFtpbmRleF1cbiAgICBpZiAoIWVudHJ5KSByZXR1cm5cblxuICAgIGVudHJ5LmVycm9yID0gZXJyb3JcbiAgICBMb2NhbFN0b3JhZ2Uud2lzaGxpc3QgPSBbXG4gICAgICAuLi53aXNobGlzdC5zbGljZSh1bmRlZmluZWQsIGluZGV4KSxcbiAgICAgIGVudHJ5LFxuICAgICAgLi4ud2lzaGxpc3Quc2xpY2UoaW5kZXggKyAxLCB1bmRlZmluZWQpLFxuICAgIF1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgQnV5QWN0aW9uKClcbiIsImltcG9ydCB7IFRha2VvdmVyQWN0aW9uIH0gZnJvbSBcIi4uLy4uL3Nlc3Npb25fc3RvcmFnZS90YWtlb3Zlcl9hY3Rpb24uZW51bVwiXG5pbXBvcnQgeyByZXNldFRha2VvdmVyIH0gZnJvbSBcIi4uL2JyYWluXCJcbmltcG9ydCB7IGNsaWNrIH0gZnJvbSBcIi4uL2NsaWNrXCJcbmltcG9ydCB0eXBlIHsgQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9uXCJcblxuY2xhc3MgRGFpbHlBY3Rpb24gaW1wbGVtZW50cyBBY3Rpb24ge1xuICByZWFkb25seSBrZXkgPSBUYWtlb3ZlckFjdGlvbi5kYWlseVxuXG4gIC8qKiBDaGVja3MgaWYgdGhlIGRhaWx5IG1hYW5hIGdpZnQgaWYgdGhlcmUuICovXG4gIGNvbmRpdGlvbigpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYWlseUdpZnRDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRhaWx5LWdpZnQtY29udGFpbmVyXCIpXG4gICAgcmV0dXJuIChcbiAgICAgICEhZGFpbHlHaWZ0Q29udGFpbmVyICYmXG4gICAgICBnZXRDb21wdXRlZFN0eWxlKGRhaWx5R2lmdENvbnRhaW5lcikuZGlzcGxheSAhPT0gXCJub25lXCJcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogQ2xpY2sgb24gdGhlIGRhaWx5IG1hYW5hIGdpZnQuXG4gICAqIEByZXR1cm5zIGBmYWxzZWAuIFRoaXMgYWN0aW9uIGRvZXMgbm90IHBlcmZvcm0gbWVhbmluZ2Z1bCBhY3Rpb25zIG9uIHRoZVxuICAgKiBwYWdlLlxuICAgKi9cbiAgYXN5bmMgcGVyZm9ybSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBkYWlseUdpZnRDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRhaWx5LWdpZnQtY29udGFpbmVyXCIpXG4gICAgaWYgKFxuICAgICAgIWRhaWx5R2lmdENvbnRhaW5lciB8fFxuICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShkYWlseUdpZnRDb250YWluZXIpLmRpc3BsYXkgPT09IFwibm9uZVwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBkYWlseUdpZnRDb250YWluZXIuY2xpY2soKVxuICAgIGF3YWl0IGNsaWNrPEhUTUxCdXR0b25FbGVtZW50PihcIi5maXJzdC1jb25uZXhpb24gLmZsYXZyLWJ1dHRvbi5kZWZhdWx0XCIpXG5cbiAgICByZXNldFRha2VvdmVyKClcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgRGFpbHlBY3Rpb24oKVxuIiwiaW1wb3J0IHsgY2FwdHVyZUVuZCB9IGZyb20gXCIuLi8uLi9hamF4L2NhcHR1cmVfZW5kXCJcbmltcG9ydCB7IGNoYW5nZVJlZ2lvbiB9IGZyb20gXCIuLi8uLi9hamF4L2NoYW5nZV9yZWdpb25cIlxuaW1wb3J0IHsgZXhwbG9yYXRpb25SZXN1bHRzIH0gZnJvbSBcIi4uLy4uL2FqYXgvZXhwbG9yYXRpb25fcmVzdWx0c1wiXG5pbXBvcnQgeyBSZXN1bHQgfSBmcm9tIFwiLi4vLi4vYXBpL3Jlc3VsdC5lbnVtXCJcbmltcG9ydCB7IENvbnNvbGUgfSBmcm9tIFwiLi4vLi4vY29uc29sZVwiXG5pbXBvcnQgeyBEdXJhdGlvblVuaXQgfSBmcm9tIFwiLi4vLi4vZHVyYXRpb25cIlxuaW1wb3J0IHR5cGUgeyBNYXBSZWdpb24sIFNlYXNvbiB9IGZyb20gXCIuLi8uLi9lbGRhcnlhL2N1cnJlbnRfcmVnaW9uXCJcbmltcG9ydCB0eXBlIHsgUGVuZGluZ1RyZWFzdXJlSHVudExvY2F0aW9uIH0gZnJvbSBcIi4uLy4uL2VsZGFyeWEvdHJlYXN1cmVcIlxuaW1wb3J0IHR5cGUgeyBBdXRvRXhwbG9yZUxvY2F0aW9uIH0gZnJvbSBcIi4uLy4uL2xvY2FsX3N0b3JhZ2UvYXV0b19leHBsb3JlX2xvY2F0aW9uXCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuaW1wb3J0IHsgU2Vzc2lvblN0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vc2Vzc2lvbl9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZVwiXG5pbXBvcnQgeyBUYWtlb3ZlckFjdGlvbiB9IGZyb20gXCIuLi8uLi9zZXNzaW9uX3N0b3JhZ2UvdGFrZW92ZXJfYWN0aW9uLmVudW1cIlxuaW1wb3J0IHsgY2xpY2sgfSBmcm9tIFwiLi4vY2xpY2tcIlxuaW1wb3J0IHsgRXhwbG9yYXRpb25TdGF0dXMgfSBmcm9tIFwiLi4vZXhwbG9yYXRpb25fc3RhdHVzLmVudW1cIlxuaW1wb3J0IHR5cGUgeyBTdGFydEV4cGxvcmF0aW9uIH0gZnJvbSBcIi4uL3N0YXJ0X2V4cGxvcmF0aW9uXCJcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuL2FjdGlvblwiXG5cbmNsYXNzIEV4cGxvcmF0aW9uQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHtcbiAgcmVhZG9ubHkga2V5ID0gVGFrZW92ZXJBY3Rpb24uZXhwbG9yYXRpb25zXG5cbiAgcHJpdmF0ZSBnZXQgZ2xvYmFscygpOiB7XG4gICAgY3VycmVudFJlZ2lvbjogTWFwUmVnaW9uXG4gICAgcGVuZGluZ1RyZWFzdXJlSHVudExvY2F0aW9uOiBQZW5kaW5nVHJlYXN1cmVIdW50TG9jYXRpb24gfCBudWxsXG4gICAgdGltZUxlZnRFeHBsb3JhdGlvbjogbnVtYmVyIHwgbnVsbFxuICB9IHtcbiAgICByZXR1cm4geyBjdXJyZW50UmVnaW9uLCBwZW5kaW5nVHJlYXN1cmVIdW50TG9jYXRpb24sIHRpbWVMZWZ0RXhwbG9yYXRpb24gfVxuICB9XG5cbiAgY29uZGl0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBMb2NhbFN0b3JhZ2UuZXhwbG9yYXRpb25zICYmXG4gICAgICAhU2Vzc2lvblN0b3JhZ2UuZXhwbG9yYXRpb25zRG9uZSAmJlxuICAgICAgISFMb2NhbFN0b3JhZ2UuYXV0b0V4cGxvcmVMb2NhdGlvbnMubGVuZ3RoXG4gICAgKVxuICB9XG5cbiAgYXN5bmMgcGVyZm9ybSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAobG9jYXRpb24ucGF0aG5hbWUgIT09IFwiL3BldFwiKSB7XG4gICAgICBwYWdlTG9hZChcIi9wZXRcIilcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5nZXRFeHBsb3JhdGlvblN0YXR1cygpXG4gICAgQ29uc29sZS5sb2coXCJFeHBsb3JhdGlvbiBzdGF0dXM6XCIsIEV4cGxvcmF0aW9uU3RhdHVzW3N0YXR1c10pXG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgIGNhc2UgRXhwbG9yYXRpb25TdGF0dXMuaWRsZTpcbiAgICAgICAgaWYgKCEoYXdhaXQgdGhpcy5zdGFydEV4cGxvcmF0aW9uKCkpLnNlbGVjdGVkKVxuICAgICAgICAgIFNlc3Npb25TdG9yYWdlLmV4cGxvcmF0aW9uc0RvbmUgPSB0cnVlXG4gICAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgICBjYXNlIEV4cGxvcmF0aW9uU3RhdHVzLnBlbmRpbmc6XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy53YWl0RXhwbG9yYXRpb24oKSkgJiYgdGhpcy5wZXJmb3JtKClcblxuICAgICAgY2FzZSBFeHBsb3JhdGlvblN0YXR1cy5yZXN1bHQ6XG4gICAgICAgIGF3YWl0IHRoaXMuZW5kRXhwbG9yYXRpb24oKVxuICAgICAgICByZXR1cm4gdGhpcy5wZXJmb3JtKClcblxuICAgICAgY2FzZSBFeHBsb3JhdGlvblN0YXR1cy5jYXB0dXJlOlxuICAgICAgICBhd2FpdCB0aGlzLmVuZENhcHR1cmUoKVxuICAgICAgICByZXR1cm4gdGhpcy5wZXJmb3JtKClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbGlja0V4cGxvcmUoKTogUHJvbWlzZTxIVE1MQnV0dG9uRWxlbWVudD4ge1xuICAgIHJldHVybiBjbGljayhcIiNleHBsb3JlLWJ1dHRvblwiKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbGlja0xvY2F0aW9uKFxuICAgIHNlbGVjdGVkOiBBdXRvRXhwbG9yZUxvY2F0aW9uXG4gICk6IFByb21pc2U8SFRNTERpdkVsZW1lbnQ+IHtcbiAgICByZXR1cm4gY2xpY2s8SFRNTERpdkVsZW1lbnQ+KFxuICAgICAgYC5tYXAtbG9jYXRpb25bZGF0YS1pZD1cIiR7c2VsZWN0ZWQubG9jYXRpb24uaWR9XCJdYFxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgY2xpY2tSZWdpb24oc2VsZWN0ZWQ6IEF1dG9FeHBsb3JlTG9jYXRpb24pOiBIVE1MRGl2RWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFxuICAgICAgYC5taW5pbWFwW2RhdGEtbWFwaWQ9XCIke3NlbGVjdGVkLnJlZ2lvbi5pZH1cIl1gXG4gICAgKVxuXG4gICAgaWYgKCFkaXYpIHtcbiAgICAgIC8vIENsZWFyaW5nIGludmFsaWQgcmVnaW9ucyBpcyB1c2VmdWwgdG8gcmVtb3ZlIGZpbmlzaGVkIGV2ZW50cy5cbiAgICAgIExvY2FsU3RvcmFnZS5hdXRvRXhwbG9yZUxvY2F0aW9ucyA9XG4gICAgICAgIExvY2FsU3RvcmFnZS5hdXRvRXhwbG9yZUxvY2F0aW9ucy5maWx0ZXIoXG4gICAgICAgICAgc2F2ZWQgPT4gc2F2ZWQucmVnaW9uLmlkICE9PSBzZWxlY3RlZC5yZWdpb24uaWRcbiAgICAgICAgKVxuXG4gICAgICBTZXNzaW9uU3RvcmFnZS5zZWxlY3RlZExvY2F0aW9uID0gbnVsbFxuICAgICAgcGFnZUxvYWQoXCIvcGV0XCIpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGRpdi5jbGljaygpXG4gICAgcmV0dXJuIGRpdlxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbGlja1NlYXNvbigpOiBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gY2xpY2s8SFRNTEltYWdlRWxlbWVudD4oXCIjY3J5c3RhbC1pbWFnZXMtY29udGFpbmVyXCIpXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuZENhcHR1cmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHZvaWQgbmV3IEF1ZGlvKFxuICAgICAgICBcIi9zdGF0aWMvZXZlbnQvMjAyMS9tdXNpYy9zb3VuZHMvbWlzc2lvbi1jb21wbGV0ZS5tcDNcIlxuICAgICAgKS5wbGF5KClcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcbiAgICB9XG5cbiAgICBhd2FpdCBjbGljazxIVE1MQnV0dG9uRWxlbWVudD4oXCIjb3Blbi1jYXB0dXJlLWludGVyZmFjZVwiKVxuICAgIGF3YWl0IGNsaWNrPEhUTUxCdXR0b25FbGVtZW50PihcIiNjYXB0dXJlLWJ1dHRvblwiKVxuICAgIGF3YWl0IGNsaWNrPEhUTUxCdXR0b25FbGVtZW50PihcIiNjbG9zZS1yZXN1bHRcIilcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5kRXhwbG9yYXRpb24oKTogUHJvbWlzZTxIVE1MRGl2RWxlbWVudD4ge1xuICAgIHJldHVybiBjbGljayhcIiNjbG9zZS1yZXN1bHRcIilcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VycmVudFNlYXNvbigpOiBTZWFzb24ge1xuICAgIHJldHVybiAoQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiYm9keVwiKT8uY2xhc3NMaXN0ID8/IFtdKVxuICAgICAgLmZpbmQoYyA9PiBjLnN0YXJ0c1dpdGgoXCJzZWFzb24tXCIpKVxuICAgICAgPy5yZXBsYWNlKFwic2Vhc29uLVwiLCBcIlwiKSA/PyBudWxsKSBhcyBTZWFzb25cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXhwbG9yYXRpb25TdGF0dXMoKTogRXhwbG9yYXRpb25TdGF0dXMge1xuICAgIGlmIChcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIFwiI3RyZWFzdXJlLWh1bnQtcmVzdWx0LW92ZXJsYXkuYWN0aXZlICNvcGVuLWNhcHR1cmUtaW50ZXJmYWNlXCJcbiAgICAgICkgfHxcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjY2FwdHVyZS1pbnRlcmZhY2Utb3V0ZXIuYWN0aXZlXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gRXhwbG9yYXRpb25TdGF0dXMuY2FwdHVyZVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI3BlbmRpbmctbWFwLWxvY2F0aW9uLWRhdGEtb3V0ZXIuYWN0aXZlXCIpIHx8XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI21hcC1jb250YWluZXIucGVuZGluZ1wiKVxuICAgICkge1xuICAgICAgcmV0dXJuIEV4cGxvcmF0aW9uU3RhdHVzLnBlbmRpbmdcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjdHJlYXN1cmUtaHVudC1yZXN1bHQtb3ZlcmxheS5hY3RpdmVcIikpXG4gICAgICByZXR1cm4gRXhwbG9yYXRpb25TdGF0dXMucmVzdWx0XG4gICAgcmV0dXJuIEV4cGxvcmF0aW9uU3RhdHVzLmlkbGVcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG93ZXN0RW5lcmd5TG9jYXRpb24oKTogQXV0b0V4cGxvcmVMb2NhdGlvbiB7XG4gICAgcmV0dXJuIExvY2FsU3RvcmFnZS5hdXRvRXhwbG9yZUxvY2F0aW9ucy5yZWR1Y2UoKGxvd2VzdCwgcGxhY2UpID0+XG4gICAgICBOdW1iZXIocGxhY2UubG9jYXRpb24uZW5lcmd5UmVxdWlyZWQpIDxcbiAgICAgIE51bWJlcihsb3dlc3QubG9jYXRpb24uZW5lcmd5UmVxdWlyZWQpXG4gICAgICAgID8gcGxhY2VcbiAgICAgICAgOiBsb3dlc3RcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGdldFNlbGVjdGVkTG9jYXRpb24oKTogQXV0b0V4cGxvcmVMb2NhdGlvbiB8IG51bGwge1xuICAgIGxldCBzZWxlY3RlZCA9IFNlc3Npb25TdG9yYWdlLnNlbGVjdGVkTG9jYXRpb25cbiAgICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgICBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0TG9jYXRpb24oKVxuICAgICAgU2Vzc2lvblN0b3JhZ2Uuc2VsZWN0ZWRMb2NhdGlvbiA9IHNlbGVjdGVkXG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdGVkXG4gIH1cblxuICBwcml2YXRlIHNlbGVjdExvY2F0aW9uKCk6IEF1dG9FeHBsb3JlTG9jYXRpb24gfCBudWxsIHtcbiAgICBjb25zdCBhZmZvcmRhYmxlID0gTG9jYWxTdG9yYWdlLmF1dG9FeHBsb3JlTG9jYXRpb25zLmZpbHRlcihcbiAgICAgIHNhdmVkID0+IE51bWJlcihzYXZlZC5sb2NhdGlvbi5lbmVyZ3lSZXF1aXJlZCkgPD0gcGV0RW5lcmd5XG4gICAgKVxuXG4gICAgY29uc3QgbWluaW11bUVuZXJneSA9IHRoaXMuZ2V0TG93ZXN0RW5lcmd5TG9jYXRpb24oKVxuICAgIGNvbnN0IG5vdERlYWRFbmQgPSBhZmZvcmRhYmxlLmZpbHRlcihcbiAgICAgIHBsYWNlID0+XG4gICAgICAgIHBldEVuZXJneSAtIE51bWJlcihwbGFjZS5sb2NhdGlvbi5lbmVyZ3lSZXF1aXJlZCkgPj1cbiAgICAgICAgTnVtYmVyKG1pbmltdW1FbmVyZ3kubG9jYXRpb24uZW5lcmd5UmVxdWlyZWQpXG4gICAgKVxuICAgIGlmIChub3REZWFkRW5kLmxlbmd0aClcbiAgICAgIHJldHVybiBub3REZWFkRW5kW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vdERlYWRFbmQubGVuZ3RoKV0gPz8gbnVsbFxuXG4gICAgY29uc3Qgc2FtZUVuZXJneSA9IGFmZm9yZGFibGUuZmlsdGVyKFxuICAgICAgcGxhY2UgPT4gTnVtYmVyKHBsYWNlLmxvY2F0aW9uLmVuZXJneVJlcXVpcmVkKSA9PT0gcGV0RW5lcmd5XG4gICAgKVxuICAgIGlmIChzYW1lRW5lcmd5Lmxlbmd0aClcbiAgICAgIHJldHVybiBzYW1lRW5lcmd5W01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHNhbWVFbmVyZ3kubGVuZ3RoKV0gPz8gbnVsbFxuXG4gICAgcmV0dXJuIGFmZm9yZGFibGVbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYWZmb3JkYWJsZS5sZW5ndGgpXSA/PyBudWxsXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN0YXJ0RXhwbG9yYXRpb24oKTogUHJvbWlzZTxTdGFydEV4cGxvcmF0aW9uPiB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmdldFNlbGVjdGVkTG9jYXRpb24oKVxuICAgIGlmICghc2VsZWN0ZWQpIHJldHVybiB7IGV4cGxvcmluZzogZmFsc2UsIHNlbGVjdGVkIH1cbiAgICBDb25zb2xlLmluZm8oXCJFeHBsb3JpbmdcIiwgc2VsZWN0ZWQpXG5cbiAgICAvLyBHbyB0byBzZWFzb25cbiAgICBpZiAoXG4gICAgICBzZWxlY3RlZC5yZWdpb24uc2Vhc29uICYmXG4gICAgICB0aGlzLmdldEN1cnJlbnRTZWFzb24oKSAhPT0gc2VsZWN0ZWQucmVnaW9uLnNlYXNvblxuICAgICkge1xuICAgICAgYXdhaXQgdGhpcy5jbGlja1NlYXNvbigpXG4gICAgICByZXR1cm4geyBleHBsb3Jpbmc6IGZhbHNlLCBzZWxlY3RlZCB9XG4gICAgfVxuXG4gICAgLy8gR28gdG8gcmVnaW9uXG4gICAgdGhpcy5jbGlja1JlZ2lvbihzZWxlY3RlZClcblxuICAgIC8vIEdvIHRvIGxvY2F0aW9uXG4gICAgYXdhaXQgdGhpcy5jbGlja0xvY2F0aW9uKHNlbGVjdGVkKVxuICAgIGF3YWl0IHRoaXMuY2xpY2tFeHBsb3JlKClcblxuICAgIFNlc3Npb25TdG9yYWdlLnNlbGVjdGVkTG9jYXRpb24gPSBudWxsXG4gICAgcmV0dXJuIHsgZXhwbG9yaW5nOiB0cnVlLCBzZWxlY3RlZCB9XG4gIH1cblxuICAvKipcbiAgICogV2FpdCBmb3IgdXAgdG8gMTAgbWludXRlcy5cbiAgICogQHJldHVybnMgd2hldGhlciB0aGUgZXhwbG9yYXRpb24gaXMgZmluaXNoZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRFeHBsb3JhdGlvbihcbiAgICBzZWxlY3RlZD86IEF1dG9FeHBsb3JlTG9jYXRpb25cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcbiAgICAgICAgYC5taW5pbWFwW2RhdGEtbWFwaWQ9XCIke3NlbGVjdGVkPy5yZWdpb24uaWQgPz8gY3VycmVudFJlZ2lvbi5pZH1cIl1gXG4gICAgICApXG4gICAgICA/LmNsaWNrKClcblxuICAgIGxldCBtcyA9IDMgKiBEdXJhdGlvblVuaXQuc2Vjb25kXG4gICAgaWYgKHNlbGVjdGVkKSBtcyArPSBzZWxlY3RlZC5sb2NhdGlvbi50aW1lVG9FeHBsb3JlICogRHVyYXRpb25Vbml0Lm1pbnV0ZVxuICAgIGVsc2UgaWYgKHRpbWVMZWZ0RXhwbG9yYXRpb24gJiYgdGltZUxlZnRFeHBsb3JhdGlvbiA+IDApXG4gICAgICBtcyArPSB0aW1lTGVmdEV4cGxvcmF0aW9uICogRHVyYXRpb25Vbml0LnNlY29uZFxuICAgIGVsc2UgaWYgKFxuICAgICAgIXBlbmRpbmdUcmVhc3VyZUh1bnRMb2NhdGlvbiAmJlxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNtYXAtY29udGFpbmVyLnBlbmRpbmdcIilcbiAgICApIHtcbiAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCBleHBsb3JhdGlvblJlc3VsdHMoKVxuICAgICAgaWYgKGpzb24ucmVzdWx0ICE9PSBSZXN1bHQuc3VjY2VzcykgcmV0dXJuIGZhbHNlXG5cbiAgICAgIGNvbnN0IGNhcHR1cmUgPSBqc29uLmRhdGEucmVzdWx0cy5maW5kKFxuICAgICAgICByZXN1bHQgPT4gcmVzdWx0LnR5cGUgPT09IFwiY2FwdHVyZVwiXG4gICAgICApXG4gICAgICBpZiAoIWNhcHR1cmUpIHJldHVybiBmYWxzZVxuICAgICAgYXdhaXQgY2FwdHVyZUVuZCgpXG5cbiAgICAgIC8vIFJlbG9hZGluZyBpcyB0aGUgb25seSBwb3NzaWJsZSBhY3Rpb24gaWYgdGhlIGV4cGxvcmF0aW9uIGZpbmlzaGVkIGluIGFcbiAgICAgIC8vIGRpZmZlcmVudCByZWdpb24uXG4gICAgICBDb25zb2xlLmVycm9yKFxuICAgICAgICBcIlJlbG9hZGluZyBiZWNhdXNlIHRoZSBleHBsb3JhdGlvbiBpcyBpbiBhbm90aGVyIHJlZ2lvbi5cIixcbiAgICAgICAgdGhpcy5nbG9iYWxzXG4gICAgICApXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgRHVyYXRpb25Vbml0Lm1pbnV0ZSkpXG4gICAgICBwYWdlTG9hZChcIi9wZXRcIilcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKG1zID4gMTAgKiBEdXJhdGlvblVuaXQubWludXRlKSByZXR1cm4gZmFsc2VcblxuICAgIENvbnNvbGUubG9nKFxuICAgICAgYFdhaXRpbmcgZm9yIHRoZSBleHBsb3JhdGlvbiB0byBlbmQgaW4gJHtNYXRoLmNlaWwoXG4gICAgICAgIG1zIC8gRHVyYXRpb25Vbml0LnNlY29uZFxuICAgICAgKX0gc2Vjb25kcy4uLmAsXG4gICAgICB0aGlzLmdsb2JhbHNcbiAgICApXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSlcbiAgICBhd2FpdCBjaGFuZ2VSZWdpb24oTnVtYmVyKHNlbGVjdGVkPy5yZWdpb24uaWQgPz8gY3VycmVudFJlZ2lvbi5pZCkpXG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmdldEV4cGxvcmF0aW9uU3RhdHVzKCkgPT09IEV4cGxvcmF0aW9uU3RhdHVzLnBlbmRpbmcgJiZcbiAgICAgIHRpbWVMZWZ0RXhwbG9yYXRpb24gJiZcbiAgICAgIHRpbWVMZWZ0RXhwbG9yYXRpb24gPCAwXG4gICAgKSB7XG4gICAgICBDb25zb2xlLmluZm8oXG4gICAgICAgIFwiUmVsb2FkaW5nIGJlY2F1c2UgdGhlIHRpbWVyIGlzIGRlc3luY2hyb25pc2VkLlwiLFxuICAgICAgICB0aGlzLmdsb2JhbHNcbiAgICAgIClcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBEdXJhdGlvblVuaXQuc2Vjb25kKSlcbiAgICAgIHBhZ2VMb2FkKFwiL3BldFwiKVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IEV4cGxvcmF0aW9uQWN0aW9uKClcbiIsImltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuaW1wb3J0IHsgcGxheUZsYXBweSwgcGxheUhhdGNobGluZ3MsIHBsYXlQZWdnbGUgfSBmcm9tIFwiLi4vLi4vbWluaWdhbWVzL2VtaWxlXCJcbmltcG9ydCB7IGZsYXBweSB9IGZyb20gXCIuLi8uLi9taW5pZ2FtZXMvZmxhcHB5XCJcbmltcG9ydCB7IGhhdGNobGluZ3MgfSBmcm9tIFwiLi4vLi4vbWluaWdhbWVzL2hhdGNobGluZ3NcIlxuaW1wb3J0IHR5cGUgeyBNaW5pZ2FtZSB9IGZyb20gXCIuLi8uLi9taW5pZ2FtZXMvbWluaWdhbWVcIlxuaW1wb3J0IHsgcGVnZ2xlIH0gZnJvbSBcIi4uLy4uL21pbmlnYW1lcy9wZWdnbGVcIlxuaW1wb3J0IHsgU2Vzc2lvblN0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vc2Vzc2lvbl9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZVwiXG5pbXBvcnQgeyBUYWtlb3ZlckFjdGlvbiB9IGZyb20gXCIuLi8uLi9zZXNzaW9uX3N0b3JhZ2UvdGFrZW92ZXJfYWN0aW9uLmVudW1cIlxuaW1wb3J0IHR5cGUgeyBBY3Rpb24gfSBmcm9tIFwiLi9hY3Rpb25cIlxuXG5jbGFzcyBNaW5pZ2FtZUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbiB7XG4gIHJlYWRvbmx5IGtleSA9IFRha2VvdmVyQWN0aW9uLm1pbmlnYW1lc1xuXG4gIGNvbmRpdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gTG9jYWxTdG9yYWdlLm1pbmlnYW1lcyAmJiAhU2Vzc2lvblN0b3JhZ2UubWluaWdhbWVzRG9uZVxuICB9XG5cbiAgLyoqIERldGVybWluZXMgaWYgdGhlIG1pbmlnYW1lcyBzaG91bGQgYmUgcGxheWVkIHJpZ2h0IG5vdy5cbiAgICogQHJldHVybnMgd2hldGhlciB0aGUgbWluaWdhbWVzIGFyZSBjdXJyZW50bHkgYmVpbmcgcGxheWVkLlxuICAgKi9cbiAgYXN5bmMgcGVyZm9ybSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBzd2l0Y2ggKGxvY2F0aW9uLnBhdGhuYW1lKSB7XG4gICAgICBjYXNlIFwiL21pbmlnYW1lc1wiOiB7XG4gICAgICAgIGNvbnN0IHBsYXlpbmcgPVxuICAgICAgICAgIHRoaXMub3Blbk1pbmlnYW1lKHBlZ2dsZSkgfHxcbiAgICAgICAgICB0aGlzLm9wZW5NaW5pZ2FtZShmbGFwcHkpIHx8XG4gICAgICAgICAgdGhpcy5vcGVuTWluaWdhbWUoaGF0Y2hsaW5ncylcblxuICAgICAgICBpZiAoIXBsYXlpbmcpIHtcbiAgICAgICAgICBTZXNzaW9uU3RvcmFnZS5taW5pZ2FtZXNEb25lID0gdHJ1ZVxuICAgICAgICAgIGRvY3VtZW50XG4gICAgICAgICAgICAucXVlcnlTZWxlY3RvcjxIVE1MQnV0dG9uRWxlbWVudD4oXG4gICAgICAgICAgICAgICcubWluaWdhbWVzLXJ1bGVzIFtyZWw9XCJidG4tY2FuY2VsXCJdJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgPy5jbGljaygpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGxheWluZ1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiL21pbmlnYW1lcy9nZW1ib21iXCI6XG4gICAgICAgIGF3YWl0IHBsYXlQZWdnbGUoKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFwiL21pbmlnYW1lcy9idWJibHRlbXBsZVwiOlxuICAgICAgICBhd2FpdCBwbGF5RmxhcHB5KClcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBcIi9taW5pZ2FtZXMvY29jb29uaW5waWNrXCI6XG4gICAgICAgIGF3YWl0IHBsYXlIYXRjaGxpbmdzKClcbiAgICAgICAgYnJlYWtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcGFnZUxvYWQoXCIvbWluaWdhbWVzXCIpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcGFnZUxvYWQoXCIvbWluaWdhbWVzXCIpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBDbGljayBvbiBhIG1pbmlnYW1lJ3MgbGluay4gQHJldHVybnMgd2hldGhlciB0aGUgbWluaWdhbWUgd2FzIG9wZW5lZC4gKi9cbiAgcHJpdmF0ZSBvcGVuTWluaWdhbWUobWluaWdhbWU6IE1pbmlnYW1lKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RhcnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxTcGFuRWxlbWVudD4oXG4gICAgICBtaW5pZ2FtZS5idXR0b25TZWxlY3RvclxuICAgIClcbiAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBzdGFydC5jbGljaygpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgTWluaWdhbWVBY3Rpb24oKVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgdHlwZSB7IFBhY2tldCB9IGZyb20gXCIuLi8uLi9hcGkvcGFja2V0XCJcbmltcG9ydCB7IENvbnNvbGUgfSBmcm9tIFwiLi4vLi4vY29uc29sZVwiXG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiXG5pbXBvcnQgeyBNYXRoVXRpbCB9IGZyb20gXCIuLi8uLi9tYXRoX3V0aWxcIlxuaW1wb3J0IHsgU2Vzc2lvblN0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vc2Vzc2lvbl9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZVwiXG5pbXBvcnQgeyBUYWtlb3ZlckFjdGlvbiB9IGZyb20gXCIuLi8uLi9zZXNzaW9uX3N0b3JhZ2UvdGFrZW92ZXJfYWN0aW9uLmVudW1cIlxuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9uXCJcblxuY2xhc3MgU3VtbWVyR2FtZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7XG4gIHJlYWRvbmx5IGtleTogVGFrZW92ZXJBY3Rpb24gPSBUYWtlb3ZlckFjdGlvbi5zdW1tZXJHYW1lXG5cbiAgY29uZGl0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBMb2NhbFN0b3JhZ2UubWluaWdhbWVzICYmXG4gICAgICAhU2Vzc2lvblN0b3JhZ2Uuc3VtbWVyR2FtZURvbmUgJiZcbiAgICAgICEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYVtocmVmPVwiL2V2ZW50L3N1bW1lclwiXScpXG4gICAgKVxuICB9XG5cbiAgYXN5bmMgcGVyZm9ybSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAobG9jYXRpb24ucGF0aG5hbWUgIT09IFwiL2V2ZW50L3N1bW1lci9nYW1lXCIpIHtcbiAgICAgIHBhZ2VMb2FkKFwiL2V2ZW50L3N1bW1lci9nYW1lXCIpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAzMDAwKSlcblxuICAgIGNvbnN0IHBsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxCdXR0b25FbGVtZW50PihcbiAgICAgICdidXR0b24uc3VtbWVyMjAyMS1idXR0b24uZXZlbnQtY29pbi1idXR0b24uYWN0aXZlW2RhdGEtY3VycmVuY3k9XCJ0b2tlblwiXSdcbiAgICApXG4gICAgQ29uc29sZS5sb2coXCJMb29raW5nIGZvciBwbGF5IGJ1dHRvbjpcIiwgcGxheSlcbiAgICBpZiAoIXBsYXkpIHtcbiAgICAgIFNlc3Npb25TdG9yYWdlLnN1bW1lckdhbWVEb25lID0gdHJ1ZVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRlZCA9IGF3YWl0IHN1bW1lckdhbWVTdGFydCgpXG4gICAgaWYgKHN0YXJ0ZWQucmVzdWx0ICE9PSBcInN1Y2Nlc3NcIikge1xuICAgICAgU2Vzc2lvblN0b3JhZ2Uuc3VtbWVyR2FtZURvbmUgPSB0cnVlXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBwbGF5LmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIilcbiAgICBwbGF5LmNsYXNzTGlzdC5hZGQoXCJpbmFjdGl2ZVwiKVxuXG4gICAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9odG1sL2ZsYXZyX25vdGlmL2ljb25fbWVzc2FnZS5odG1sXCIpXG4gICAgJC5mbGF2ck5vdGlmKFxuICAgICAgdGVtcGxhdGUucmVuZGVyKHtcbiAgICAgICAgaWNvbjogXCIvc3RhdGljL2V2ZW50L21pbmlnYW1lcy9zbmFrZS9pbWcvaGVhZC5wbmdcIixcbiAgICAgICAgbWVzc2FnZTogdHJhbnNsYXRlLm1pbmlnYW1lcy5wbGF5aW5nKFwiU25ha2VcIiksXG4gICAgICB9KVxuICAgIClcblxuICAgIGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KHJlc29sdmUgPT5cbiAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICgpID0+IHJlc29sdmUodHJ1ZSksXG4gICAgICAgIE1hdGhVdGlsLnJhbmRvbUJldHdlZW4oNjBfMDAwICogMC44LCA2MF8wMDApXG4gICAgICApXG4gICAgKVxuXG4gICAgY29uc3Qgc2F2ZWQgPSBhd2FpdCBzdW1tZXJHYW1lU2F2ZSgpXG4gICAgaWYgKHNhdmVkLnJlc3VsdCAhPT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgIFNlc3Npb25TdG9yYWdlLnN1bW1lckdhbWVEb25lID0gdHJ1ZVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgJC5mbGF2ck5vdGlmKFxuICAgICAgdGVtcGxhdGUucmVuZGVyKHtcbiAgICAgICAgaWNvbjogXCIvc3RhdGljL2V2ZW50L21pbmlnYW1lcy9zbmFrZS9pbWcvaGVhZC5wbmdcIixcbiAgICAgICAgbWVzc2FnZTogdHJhbnNsYXRlLm1pbmlnYW1lcy5wbGF5ZWQoXCJTbmFrZVwiKSxcbiAgICAgIH0pXG4gICAgKVxuXG4gICAgcGFnZUxvYWQoXCIvZXZlbnQvc3VtbWVyL2dhbWVcIilcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1bW1lckdhbWVTdGFydCgpOiBQcm9taXNlPFBhY2tldDxcIlwiPj4ge1xuICBjb25zdCBjdXJyZW5jeSA9IFwidG9rZW5cIlxuXG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICB2b2lkICQucG9zdChcbiAgICAgIFwiL2V2ZW50L3N1bW1lci9nYW1lL3N0YXJ0XCIsXG4gICAgICB7IGN1cnJlbmN5OiBjdXJyZW5jeSB9LFxuICAgICAgZnVuY3Rpb24gKGpzb246IFBhY2tldDxcIlwiPikge1xuICAgICAgICBpZiAoanNvbi5yZXN1bHQgIT09IFwic3VjY2Vzc1wiKSAkLmZsYXZyTm90aWYoanNvbi5kYXRhKVxuXG4gICAgICAgIHJlc29sdmUoanNvbilcbiAgICAgIH1cbiAgICApXG4gIH0pXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN1bW1lckdhbWVTYXZlKCk6IFByb21pc2U8UGFja2V0PFN1bW1lckdhbWVTYXZlRGF0YT4+IHtcbiAgY29uc3Qgd2luID0gdHJ1ZVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICB2b2lkICQucG9zdChcbiAgICAgIFwiL2V2ZW50L3N1bW1lci9nYW1lL3NhdmVcIixcbiAgICAgIHsgd2luOiB3aW4gfSxcbiAgICAgIGZ1bmN0aW9uIChqc29uOiBQYWNrZXQ8U3VtbWVyR2FtZVNhdmVEYXRhPikge1xuICAgICAgICBpZiAoanNvbi5yZXN1bHQgIT09IFwic3VjY2Vzc1wiKSAkLmZsYXZyTm90aWYoanNvbi5kYXRhKVxuXG4gICAgICAgIHJlc29sdmUoanNvbilcbiAgICAgIH1cbiAgICApXG4gIH0pXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VtbWVyR2FtZVNhdmVEYXRhIHtcbiAgZnJhZ21lbnQ6IGJvb2xlYW4gfCBudW1iZXJcbiAgbGFzdEZyYWdtZW50OiBib29sZWFuXG4gIHZpZXc6IFZpZXdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWaWV3IHtcbiAgYWN0aXZlR2FtZTogYm9vbGVhblxuICBlbmRFdmVudDogYm9vbGVhblxuICBmcmFnbWVudHNPd25lZDogbnVtYmVyXG4gIGZyYWdtZW50c1RvdGFsOiBudW1iZXJcbiAgcGV0VW5sb2NrZWQ6IGJvb2xlYW5cbiAgcmVtYWluaW5nVGltZTogbnVtYmVyXG4gIHNlcnZlclJld2FyZEN1cnJlbnQ6IG51bWJlclxuICBzZXJ2ZXJSZXdhcmRQZXJjZW50YWdlOiBudW1iZXJcbiAgc2VydmVyUmV3YXJkVG90YWw6IG51bWJlclxuICBzaG91bGRDaG9vc2VCYW5rT3V0Zml0OiBib29sZWFuXG4gIHRva2VuczogbnVtYmVyXG4gIHRyYWluaW5nQXZhaWxhYmxlOiBib29sZWFuXG59XG5cbmV4cG9ydCBjb25zdCBzdW1tZXJHYW1lQWN0aW9uID0gbmV3IFN1bW1lckdhbWVBY3Rpb24oKVxuIiwiaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gXCIuLi8uLi9jb25zb2xlXCJcbmltcG9ydCB7IFRha2VvdmVyQWN0aW9uIH0gZnJvbSBcIi4uLy4uL3Nlc3Npb25fc3RvcmFnZS90YWtlb3Zlcl9hY3Rpb24uZW51bVwiXG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi9hY3Rpb25cIlxuXG5jbGFzcyBXYWl0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHtcbiAgcmVhZG9ubHkga2V5ID0gVGFrZW92ZXJBY3Rpb24ud2FpdFxuXG4gIGNvbmRpdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgYXN5bmMgcGVyZm9ybSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBDb25zb2xlLmxvZyhgV2FpdGluZyBmb3IgMTAgbWludXRlcy4uLmApXG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4ocmVzb2x2ZSA9PlxuICAgICAgc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKGZhbHNlKSwgMTAgKiA2MCAqIDEwMDApXG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBXYWl0QWN0aW9uKClcbiIsImV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGljazxUIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KFxuICBzZWxlY3Rvcjogc3RyaW5nXG4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KHJlc29sdmUgPT4ge1xuICAgIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8VD4oc2VsZWN0b3IpXG4gICAgICBpZiAoIWVsZW1lbnQpIHJldHVyblxuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbClcblxuICAgICAgLy8gU29tZSBlbGVtZW50cyBkb24ndCBoYXZlIHRoZWlyIGNsaWNrIGhhbmRsZXJzIHJlYWR5IHVudGlsIHRoZXkncmVcbiAgICAgIC8vIGhvdmVyZWQuXG4gICAgICBjb25zdCBtb3VzZUV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJNb3VzZUV2ZW50XCIpXG4gICAgICBtb3VzZUV2ZW50LmluaXRFdmVudChcIm1vdXNlb3ZlclwiKVxuICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG1vdXNlRXZlbnQpXG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBlbGVtZW50LmNsaWNrKClcbiAgICAgICAgcmVzb2x2ZShlbGVtZW50KVxuICAgICAgfSwgODAwKVxuICAgIH0sIDgwMClcbiAgfSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXQ8VCBleHRlbmRzIEhUTUxFbGVtZW50PihcbiAgc2VsZWN0b3I6IHN0cmluZ1xuKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxUPihyZXNvbHZlID0+IHtcbiAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPFQ+KHNlbGVjdG9yKVxuICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm5cblxuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbClcbiAgICAgIHJlc29sdmUoZWxlbWVudClcbiAgICB9LCA4MDApXG4gIH0pXG59XG4iLCJleHBvcnQgZW51bSBFeHBsb3JhdGlvblN0YXR1cyB7XG4gIGlkbGUsXG4gIHJlc3VsdCxcbiAgY2FwdHVyZSxcbiAgcGVuZGluZyxcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc0VudW08VD4odmFsdWU6IHVua25vd24sIGVudW1lcmF0aW9uOiBUKTogdmFsdWUgaXMgVFtrZXlvZiBUXSB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGVudW1lcmF0aW9uKS5pbmNsdWRlcyh2YWx1ZSlcbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuaW1wb3J0IHR5cGUgeyBNYXJrZXRIaXN0b3J5IH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL21hcmtldF9oaXN0b3J5XCJcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRBdWN0aW9ucygpOiB2b2lkIHtcbiAgaWYgKGxvY2F0aW9uLnBhdGhuYW1lICE9PSBcIi9tYXJrZXRwbGFjZS9hdWN0aW9uc1wiKSByZXR1cm5cblxuICBjb25zdCBtYXJrZXRwbGFjZUFjdGl2ZUF1Y3Rpb25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgXCIjbWFya2V0cGxhY2UtYWN0aXZlLWF1Y3Rpb25zXCJcbiAgKVxuICBpZiAoIW1hcmtldHBsYWNlQWN0aXZlQXVjdGlvbnMpIHJldHVyblxuXG4gIGNvbnN0IGxheW91dDJjb2wgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcbiAgICBcIi5tYXJrZXRwbGFjZS1tYWluLWNvbnRhaW5lciAjbGF5b3V0LTJjb2xcIlxuICApXG4gIGlmIChsYXlvdXQyY29sKSBsYXlvdXQyY29sLnN0eWxlLm92ZXJmbG93WCA9IFwidmlzaWJsZVwiXG5cbiAgbG9hZEhpc3RvcnkobWFya2V0cGxhY2VBY3RpdmVBdWN0aW9ucylcbn1cblxuZnVuY3Rpb24gbG9hZEhpc3RvcnkobWFya2V0cGxhY2VBY3RpdmVBdWN0aW9uczogSFRNTERpdkVsZW1lbnQpOiB2b2lkIHtcbiAgbWFya2V0cGxhY2VBY3RpdmVBdWN0aW9ucy5xdWVyeVNlbGVjdG9yKFwic3R5bGVcIik/LnJlbW92ZSgpXG4gIG1hcmtldHBsYWNlQWN0aXZlQXVjdGlvbnMucXVlcnlTZWxlY3RvcihcIiNwdXJjaGFzZS1oaXN0b3J5XCIpPy5yZW1vdmUoKVxuICBtYXJrZXRwbGFjZUFjdGl2ZUF1Y3Rpb25zLnF1ZXJ5U2VsZWN0b3IoXCIjc2FsZS1oaXN0b3J5XCIpPy5yZW1vdmUoKVxuXG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9tYXJrZXRfaGlzdG9yeS5odG1sXCIpXG4gIGNvbnN0IGhpc3Rvcnk6IE1hcmtldEhpc3RvcnkgPSB7XG4gICAgcHVyY2hhc2VzOiBMb2NhbFN0b3JhZ2UucHVyY2hhc2VzLm1hcChwdXJjaGFzZSA9PiAoe1xuICAgICAgLi4ucHVyY2hhc2UsXG4gICAgICBkYXRlOiB0cmFuc2xhdGUubWFya2V0LmF1Y3Rpb25zLmRhdGVfdGltZV9mb3JtYXQuZm9ybWF0KFxuICAgICAgICBuZXcgRGF0ZShwdXJjaGFzZS5kYXRlKVxuICAgICAgKSxcbiAgICB9KSksXG4gICAgc2FsZXM6IExvY2FsU3RvcmFnZS5zYWxlcy5tYXAoc2FsZSA9PiAoe1xuICAgICAgLi4uc2FsZSxcbiAgICAgIGRhdGU6IHRyYW5zbGF0ZS5tYXJrZXQuYXVjdGlvbnMuZGF0ZV90aW1lX2Zvcm1hdC5mb3JtYXQoXG4gICAgICAgIG5ldyBEYXRlKHNhbGUuZGF0ZSlcbiAgICAgICksXG4gICAgfSkpLFxuICB9XG5cbiAgbWFya2V0cGxhY2VBY3RpdmVBdWN0aW9ucy5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgXCJiZWZvcmVlbmRcIixcbiAgICB0ZW1wbGF0ZS5yZW5kZXIoeyAuLi5oaXN0b3J5LCB0cmFuc2xhdGUgfSlcbiAgKVxuXG4gIGZvciAoY29uc3QgcHVyY2hhc2Ugb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MTElFbGVtZW50PihcbiAgICBcIiNwdXJjaGFzZS1oaXN0b3J5IC5tYXJrZXRwbGFjZS1hdWN0aW9ucy1pdGVtXCJcbiAgKSkge1xuICAgIGNvbnN0IGl0ZW1pZCA9IHB1cmNoYXNlLmRhdGFzZXQuaXRlbWlkXG4gICAgcHVyY2hhc2UucXVlcnlTZWxlY3RvcihcIi5kZWxldGUtYnV0dG9uXCIpPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgTG9jYWxTdG9yYWdlLnB1cmNoYXNlcyA9IExvY2FsU3RvcmFnZS5wdXJjaGFzZXMuZmlsdGVyKFxuICAgICAgICBwdXJjaGFzZSA9PiBwdXJjaGFzZS5pdGVtaWQgIT09IGl0ZW1pZFxuICAgICAgKVxuXG4gICAgICBsb2FkSGlzdG9yeShtYXJrZXRwbGFjZUFjdGl2ZUF1Y3Rpb25zKVxuICAgIH0pXG4gIH1cblxuICBmb3IgKGNvbnN0IHNhbGUgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MTElFbGVtZW50PihcbiAgICBcIiNzYWxlLWhpc3RvcnkgLm1hcmtldHBsYWNlLXNhbGVzLWl0ZW1cIlxuICApKSB7XG4gICAgY29uc3QgaWNvbiA9IHNhbGUucXVlcnlTZWxlY3RvcjxIVE1MSW1hZ2VFbGVtZW50PihcIi5hYnN0cmFjdC1pY29uIGltZ1wiKT8uc3JjXG4gICAgc2FsZS5xdWVyeVNlbGVjdG9yKFwiLmRlbGV0ZS1idXR0b25cIik/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICBMb2NhbFN0b3JhZ2Uuc2FsZXMgPSBMb2NhbFN0b3JhZ2Uuc2FsZXMuZmlsdGVyKHNhbGUgPT4gc2FsZS5pY29uICE9PSBpY29uKVxuXG4gICAgICBsb2FkSGlzdG9yeShtYXJrZXRwbGFjZUFjdGl2ZUF1Y3Rpb25zKVxuICAgIH0pXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIlxuaW1wb3J0IHsgY2Fyb3VzZWxCZWVtb292QW5ub3lhbmNlcyB9IGZyb20gXCIuLi9jYXJvdXNlbC9jYXJvdXNlbF9iZWVtb292X2Fubm95YW5jZXNcIlxuaW1wb3J0IHsgY2Fyb3VzZWxEb3dubG9hZEZhY2UgfSBmcm9tIFwiLi4vY2Fyb3VzZWwvY2Fyb3VzZWxfZG93bmxvYWRfZmFjZVwiXG5pbXBvcnQgeyBjYXJvdXNlbERvd25sb2FkR3VhcmRpYW4gfSBmcm9tIFwiLi4vY2Fyb3VzZWwvY2Fyb3VzZWxfZG93bmxvYWRfZ3VhcmRpYW5cIlxuaW1wb3J0IHsgY2Fyb3VzZWxFRSB9IGZyb20gXCIuLi9jYXJvdXNlbC9jYXJvdXNlbF9lbGRhcnlhX2VuaGFuY2VtZW50c1wiXG5pbXBvcnQgeyBjYXJvdXNlbFRha2VvdmVyIH0gZnJvbSBcIi4uL2Nhcm91c2VsL2Nhcm91c2VsX3Rha2VvdmVyXCJcbmltcG9ydCB7IGRvd25sb2FkRmFjZSwgZG93bmxvYWRHdWFyZGlhbiB9IGZyb20gXCIuLi9kb3dubG9hZC1jYW52YXNcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuaW1wb3J0IHsgU2Vzc2lvblN0b3JhZ2UgfSBmcm9tIFwiLi4vc2Vzc2lvbl9zdG9yYWdlL3Nlc3Npb25fc3RvcmFnZVwiXG5pbXBvcnQgeyB0b2dnbGVUYWtlb3ZlciB9IGZyb20gXCIuLi90YWtlb3Zlci9icmFpblwiXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQ2Fyb3VzZWwoKTogdm9pZCB7XG4gIGNvbnN0IGNhcm91c2VsSW5uZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2Nhcm91c2VsLWlubmVyXCIpXG4gIGlmICghY2Fyb3VzZWxJbm5lciB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmNhcm91c2VsLWVlXCIpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBJbXBvcnQgY2Fyb3VzZWwgdGVtcGxhdGVcbiAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2Nhcm91c2VsX25ld3MuaHRtbFwiKVxuXG4gIGNvbnN0IGNvbnRleHRzID0gW1xuICAgIC8vIEludHJvXG4gICAgY2Fyb3VzZWxFRSxcblxuICAgIC8vIEZlYXR1cmVzXG4gICAgLi4uKChMb2NhbFN0b3JhZ2UubWluaWdhbWVzIHx8XG4gICAgICBMb2NhbFN0b3JhZ2UuZXhwbG9yYXRpb25zIHx8XG4gICAgICBMb2NhbFN0b3JhZ2UubWFya2V0KSAmJlxuICAgIExvY2FsU3RvcmFnZS51bmxvY2tlZFxuICAgICAgPyBbY2Fyb3VzZWxUYWtlb3Zlcl1cbiAgICAgIDogW10pLFxuICAgIGNhcm91c2VsRG93bmxvYWRHdWFyZGlhbixcbiAgICBjYXJvdXNlbERvd25sb2FkRmFjZSxcblxuICAgIC8vIEFkc1xuICAgIGNhcm91c2VsQmVlbW9vdkFubm95YW5jZXMsXG4gIF1cblxuICAvLyBBZGQgZW50cmllcyB0byB0aGUgY2Fyb3VzZWxcbiAgY2Fyb3VzZWxJbm5lci5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgXCJiZWZvcmVlbmRcIixcbiAgICBjb250ZXh0cy5tYXAoYmFubmVyID0+IHRlbXBsYXRlLnJlbmRlcihiYW5uZXIpKS5qb2luKFwiXFxuXCIpXG4gIClcblxuICAvLyBBZGQgbGlua3NcbiAgZm9yIChjb25zdCBjYXJvdXNlbCBvZiBjb250ZXh0cykge1xuICAgIGlmICghY2Fyb3VzZWwuaHJlZikgY29udGludWVcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBjYXJvdXNlbElubmVyLnF1ZXJ5U2VsZWN0b3IoYCMke2Nhcm91c2VsLmlkfWApXG4gICAgaWYgKCFlbGVtZW50KSBjb250aW51ZVxuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiYWN0aXZlXCIpKSBvcGVuKGNhcm91c2VsLmhyZWYsIFwiX2JsYW5rXCIpXG4gICAgfSlcbiAgfVxuXG4gIC8vIEFkZCBjbGljayBldmVudHNcblxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChjYXJvdXNlbERvd25sb2FkRmFjZS5pZClcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBkb3dubG9hZEZhY2UpXG5cbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoY2Fyb3VzZWxEb3dubG9hZEd1YXJkaWFuLmlkKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGRvd25sb2FkR3VhcmRpYW4pXG5cbiAgY29uc3QgdGFrZW92ZXJBbmNob3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjYXJvdXNlbFRha2VvdmVyLmlkKVxuICB0YWtlb3ZlckFuY2hvcj8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICB0b2dnbGVUYWtlb3ZlcigpXG4gICAgdGFrZW92ZXJUaXRsZSh0YWtlb3ZlckFuY2hvcilcbiAgfSlcblxuICBpZiAodGFrZW92ZXJBbmNob3IpIHRha2VvdmVyVGl0bGUodGFrZW92ZXJBbmNob3IpXG59XG5cbmZ1bmN0aW9uIHRha2VvdmVyVGl0bGUodGFrZW92ZXJBbmNob3I6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gIGNvbnN0IHRha2VvdmVySDQgPSB0YWtlb3ZlckFuY2hvci5xdWVyeVNlbGVjdG9yKFwiaDRcIilcbiAgaWYgKHRha2VvdmVySDQpIHtcbiAgICB0YWtlb3Zlckg0LmlubmVyVGV4dCA9IFNlc3Npb25TdG9yYWdlLnRha2VvdmVyXG4gICAgICA/IHRyYW5zbGF0ZS5jYXJvdXNlbC50YWtlb3Zlci5kaXNhYmxlX3Rha2VvdmVyXG4gICAgICA6IHRyYW5zbGF0ZS5jYXJvdXNlbC50YWtlb3Zlci5lbmFibGVfdGFrZW92ZXJcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyBzYXZlRmF2b3VyaXRlLCBzaG93RmF2b3VyaXRlIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2UvZmFrZV9mYXZvdXJpdGVzXCJcbmltcG9ydCB7IGV4cG9ydFByZXZpZXcsIGltcG9ydE91dGZpdCB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL2Zhdm91cml0ZXNfYWN0aW9uc1wiXG5pbXBvcnQgeyBkb3dubG9hZEFwcGVhcmFuY2UgfSBmcm9tIFwiLi4vZG93bmxvYWQtY2FudmFzXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgaW5kZXhlZF9kYiBmcm9tIFwiLi4vaW5kZXhlZF9kYi9pbmRleGVkX2RiXCJcbmltcG9ydCB0eXBlIHsgRmF2b3VyaXRlc0FjdGlvbiB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9mYXZvdXJpdGVzX2FjdGlvblwiXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRmF2b3VyaXRlcygpOiB2b2lkIHtcbiAgbG9hZEZhdm91cml0ZXNBY3Rpb25zKClcbiAgdm9pZCBsb2FkRmFrZUZhdm91cml0ZXMoKVxufVxuXG5mdW5jdGlvbiBsb2FkRmF2b3VyaXRlc0FjdGlvbnMoKTogdm9pZCB7XG4gIGNvbnN0IGFjdGlvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImZhdm9yaXRlcy1hY3Rpb25zXCIpXG4gIGlmICghYWN0aW9ucyB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmZhdm9yaXRlcy1hY3Rpb24tZWVcIikpIHJldHVyblxuXG4gIGNvbnN0IGFjdGlvblRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9mYXZvdXJpdGVzX2FjdGlvbi5odG1sXCIpXG5cbiAgY29uc3QgaW1wb3J0QWN0aW9uOiBGYXZvdXJpdGVzQWN0aW9uID0ge1xuICAgIGlkOiBcImltcG9ydC1vdXRmaXRcIixcbiAgICB0ZXh0OiB0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLmJ1dHRvbnMuaW1wb3J0LFxuICB9XG4gIGNvbnN0IGV4cG9ydEFjdGlvbjogRmF2b3VyaXRlc0FjdGlvbiA9IHtcbiAgICBpZDogXCJleHBvcnQtb3V0Zml0XCIsXG4gICAgdGV4dDogdHJhbnNsYXRlLmFwcGVhcmFuY2UuZmF2b3VyaXRlcy5idXR0b25zLmV4cG9ydCxcbiAgfVxuICBjb25zdCBkb3dubG9hZEFjdGlvbjogRmF2b3VyaXRlc0FjdGlvbiA9IHtcbiAgICBpZDogXCJkb3dubG9hZC1vdXRmaXRcIixcbiAgICB0ZXh0OiB0cmFuc2xhdGUuYXBwZWFyYW5jZS5mYXZvdXJpdGVzLmJ1dHRvbnMuZG93bmxvYWQsXG4gIH1cblxuICBhY3Rpb25zLmluc2VydEFkamFjZW50SFRNTChcbiAgICBcImJlZm9yZWVuZFwiLFxuICAgIGFjdGlvblRlbXBsYXRlLnJlbmRlcihpbXBvcnRBY3Rpb24pICtcbiAgICAgIGFjdGlvblRlbXBsYXRlLnJlbmRlcihleHBvcnRBY3Rpb24pICtcbiAgICAgIGFjdGlvblRlbXBsYXRlLnJlbmRlcihkb3dubG9hZEFjdGlvbilcbiAgKVxuXG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKGltcG9ydEFjdGlvbi5pZClcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBpbXBvcnRPdXRmaXQpXG5cbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoZXhwb3J0QWN0aW9uLmlkKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGV4cG9ydFByZXZpZXcpXG5cbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoZG93bmxvYWRBY3Rpb24uaWQpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZG93bmxvYWRBcHBlYXJhbmNlKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEZha2VGYXZvdXJpdGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0aHVtYnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FsbC1vdXRmaXQtdGh1bWJzIC5tQ1NCX2NvbnRhaW5lclwiKVxuICBpZiAoIXRodW1icykgcmV0dXJuXG5cbiAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL291dGZpdF90aHVtYnMuaHRtbFwiKVxuXG4gIGNvbnN0IGZhdm91cml0ZXMgPSBhd2FpdCBpbmRleGVkX2RiLmdldEZhdm91cml0ZU91dGZpdHMoKVxuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjZWUtb3V0Zml0LXRodW1ic1wiKT8ucmVtb3ZlKClcbiAgdGh1bWJzLmluc2VydEFkamFjZW50SFRNTChcbiAgICBcImJlZm9yZWVuZFwiLFxuICAgIHRlbXBsYXRlLnJlbmRlcih7XG4gICAgICBvdXRmaXRzOiBmYXZvdXJpdGVzLFxuICAgIH0pXG4gIClcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwiLmVlLWF2YWlsYWJsZS1zbG90XCIpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCk6IHZvaWQgPT4gdm9pZCBzYXZlRmF2b3VyaXRlKCkpXG5cbiAgZm9yIChjb25zdCBkaXYgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRGl2RWxlbWVudD4oXG4gICAgXCIuZWUtb3V0Zml0LXRodW1iXCJcbiAgKSkge1xuICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgZmF2b3VyaXRlID0gZmF2b3VyaXRlcy5maW5kKFxuICAgICAgICBmYXZvdXJpdGUgPT4gZmF2b3VyaXRlLmlkID09PSBOdW1iZXIoZGl2LmRhdGFzZXQuYXJyYXlJbmRleClcbiAgICAgIClcbiAgICAgIGlmICghZmF2b3VyaXRlKSByZXR1cm5cblxuICAgICAgc2hvd0Zhdm91cml0ZShmYXZvdXJpdGUpXG4gICAgfSlcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHR5cGUgeyBIb21lQ29udGVudFNtYWxsIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL2hvbWVfY29udGVudF9zbWFsbFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkSG9tZUNvbnRlbnQoKTogdm9pZCB7XG4gIGNvbnN0IGhvbWVDb250ZW50U21hbGxzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJob21lLWNvbnRlbnQtc21hbGxzXCIpXG4gIGlmIChcbiAgICAhaG9tZUNvbnRlbnRTbWFsbHMgfHxcbiAgICBob21lQ29udGVudFNtYWxscy5xdWVyeVNlbGVjdG9yKFwiLmhvbWUtY29udGVudC1zbWFsbC1lZVwiKVxuICApXG4gICAgcmV0dXJuXG5cbiAgLy8gUmVtb3ZlIGJhbmtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJob21lLWJhbmtcIik/LnJlbW92ZSgpXG5cbiAgLy8gQWRkIGZvcnVtXG4gIGNvbnN0IHNtYWxsVGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2hvbWVfY29udGVudF9zbWFsbC5odG1sXCIpXG4gIGNvbnN0IHNtYWxsQ29udGVudDogSG9tZUNvbnRlbnRTbWFsbCA9IHtcbiAgICBiYWNrZ3JvdW5kSW1hZ2U6XG4gICAgICBcIi9hc3NldHMvaW1nL21pbmlnYW1lcy90cmVhc3VyZWh1bnQvYTQ4YmJjNGU0ODQ5NzQ1ZWJlNmRiY2Y1MzEzZWIzZjAuanBnXCIsXG4gICAgaDQ6IHRyYW5zbGF0ZS5ob21lLmZvcnVtLFxuICAgIGhyZWY6IFwiL2ZvcnVtXCIsXG4gICAgaWQ6IFwiZm9ydW1cIixcbiAgfVxuXG4gIGhvbWVDb250ZW50U21hbGxzLmluc2VydEFkamFjZW50SFRNTChcbiAgICBcImJlZm9yZWVuZFwiLFxuICAgIHNtYWxsVGVtcGxhdGUucmVuZGVyKHNtYWxsQ29udGVudClcbiAgKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyB0cmltSWNvbiB9IGZyb20gXCIuLi9lbGRhcnlhX3V0aWxcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuaW1wb3J0IHR5cGUgeyBXaXNoZWRJdGVtIH0gZnJvbSBcIi4uL2xvY2FsX3N0b3JhZ2Uvd2lzaGVkX2l0ZW1cIlxuaW1wb3J0IHR5cGUgeyBEYXRhUHJvZHVjdCB9IGZyb20gXCIuLi9tYWxsL2RhdGFfcHJvZHVjdFwiXG5pbXBvcnQgdHlwZSB7IE1hbGxFbnRyeSB9IGZyb20gXCIuLi9tYWxsL21hbGxfZW50cnlcIlxuaW1wb3J0IHsgUmFyaXR5IH0gZnJvbSBcIi4uL21hcmtldHBsYWNlL2VudW1zL3Jhcml0eS5lbnVtXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRNYWxsKCk6IHZvaWQge1xuICBpZiAoIWxvY2F0aW9uLnBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvbWFsbFwiKSkgcmV0dXJuXG5cbiAgZm9yIChjb25zdCBsaSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxMSUVsZW1lbnQ+KFwiW2RhdGEtcHJvZHVjdF1cIikpXG4gICAgbGkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IGFkZFdpc2hsaXN0QnV0dG9uKGxpKSlcbn1cblxuZnVuY3Rpb24gYWRkV2lzaGxpc3RCdXR0b24obGk6IEhUTUxMSUVsZW1lbnQpOiB2b2lkIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhZGQtdG8td2lzaGxpc3RcIik/LnJlbW92ZSgpXG5cbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIiNtYWxsLXByb2R1Y3REZXRhaWwtaW5mb1wiKVxuICAgID8uaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgICAgXCJiZWZvcmVlbmRcIixcbiAgICAgIFwiPGJ1dHRvbiBpZD0nYWRkLXRvLXdpc2hsaXN0JyBjbGFzcz0nbmwtYnV0dG9uJyBzdHlsZT0nbWFyZ2luOiAyMHB4IGF1dG8gMDsgbWluLXdpZHRoOiAyMDBweDsnPkFkZCB0byBtYXJrZXQgd2lzaGxpc3Q8L2J1dHRvbj5cIlxuICAgIClcblxuICBjb25zdCBtYXhRdWFudGl0eSA9IGxpLnF1ZXJ5U2VsZWN0b3I8SFRNTFNwYW5FbGVtZW50PihcIi5pdGVtLW1heFF1YW50aXR5XCIpXG5cbiAgY29uc3QgbWFsbEVudHJ5OiBNYWxsRW50cnkgPSB7XG4gICAgcHJvZHVjdDogSlNPTi5wYXJzZShsaS5kYXRhc2V0LnByb2R1Y3QhKSBhcyBEYXRhUHJvZHVjdCxcbiAgICBpY29uOiB0cmltSWNvbihcbiAgICAgIGxpLnF1ZXJ5U2VsZWN0b3I8SFRNTEltYWdlRWxlbWVudD4oXCJpbWcubWFsbC1wcm9kdWN0LWljb25cIikhLnNyY1xuICAgICksXG4gICAgcmFyaXR5OlxuICAgICAgUmFyaXR5W1xuICAgICAgICAobGlcbiAgICAgICAgICAucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgIFwiLnJhcml0eS1tYXJrZXItY29tbW9uLCAucmFyaXR5LW1hcmtlci1yYXJlLCAucmFyaXR5LW1hcmtlci1lcGljLCAucmFyaXR5LW1hcmtlci1sZWdlbmRhcnksIC5yYXJpdHktbWFya2VyLWV2ZW50XCJcbiAgICAgICAgICApXG4gICAgICAgICAgPy5jbGFzc05hbWUuc3BsaXQoXCJyYXJpdHktbWFya2VyLVwiKVsxXSA/PyBcIlwiKSBhcyBrZXlvZiB0eXBlb2YgUmFyaXR5XG4gICAgICBdLFxuICAgIG1heFF1YW50aXR5OiBtYXhRdWFudGl0eSA/IE51bWJlcihtYXhRdWFudGl0eS5pbm5lclRleHQpIDogdW5kZWZpbmVkLFxuICAgIGFic3RyYWN0VHlwZTpcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFxuICAgICAgICBcIiNtYWxsLW1lbnUgLnRvb2x0aXAuYWN0aXZlIC50b29sdGlwLWNvbnRlbnRcIlxuICAgICAgKT8uaW5uZXJUZXh0ID8/IFwiXCIsXG4gIH1cblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwiI2FkZC10by13aXNobGlzdFwiKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IGFkZFRvV2lzaGxpc3RGbGF2cihtYWxsRW50cnkpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkVG9XaXNobGlzdEZsYXZyKG1hbGxFbnRyeTogTWFsbEVudHJ5KTogdm9pZCB7XG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9hdXRvX2J1eV9mbGF2cl9tYWxsLmh0bWxcIilcblxuICAkLmZsYXZyKHtcbiAgICBjb250ZW50OiB0ZW1wbGF0ZS5yZW5kZXIoeyB0cmFuc2xhdGUgfSksXG4gICAgYnV0dG9uczoge1xuICAgICAgY2xvc2U6IHsgc3R5bGU6IFwiY2xvc2VcIiB9LFxuICAgICAgc2F2ZToge1xuICAgICAgICBhY3Rpb246ICgpID0+IHNhdmUobWFsbEVudHJ5KSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkaWFsb2c6IFwicHJvbXB0XCIsXG4gICAgcHJvbXB0OiB7XG4gICAgICB2YWx1ZTogXCJcIixcbiAgICB9LFxuICAgIG9uQnVpbGQ6ICRjb250YWluZXIgPT4ge1xuICAgICAgJGNvbnRhaW5lci5hZGRDbGFzcyhcIm5ldy1sYXlvdXQtcG9wdXBcIilcblxuICAgICAgZG9jdW1lbnRcbiAgICAgICAgLnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oXCIuZmxhdnItcHJvbXB0XCIpXG4gICAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsICh7IGtleSB9KSA9PiB7XG4gICAgICAgICAgaWYgKGtleSAhPT0gXCJFbnRlclwiKSByZXR1cm5cbiAgICAgICAgICBzYXZlKG1hbGxFbnRyeSlcbiAgICAgICAgfSlcbiAgICB9LFxuICB9KVxufVxuXG5mdW5jdGlvbiBzYXZlKG1hbGxFbnRyeTogTWFsbEVudHJ5KTogYm9vbGVhbiB7XG4gIGNvbnN0IHByaWNlID0gTnVtYmVyKFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oXCIuZmxhdnItcHJvbXB0XCIpPy52YWx1ZS50cmltKClcbiAgKVxuICBpZiAoIXByaWNlIHx8IHByaWNlIDw9IDApIHtcbiAgICAkLmZsYXZyTm90aWYodHJhbnNsYXRlLm1hcmtldC5hZGRfdG9fd2lzaGxpc3QuaW52YWxpZF9wcmljZSlcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IHdpc2hsaXN0ID0gTG9jYWxTdG9yYWdlLndpc2hsaXN0LmZpbHRlcihcbiAgICB3aXNobGlzdEVudHJ5ID0+IHdpc2hsaXN0RW50cnkuaWNvbiAhPT0gbWFsbEVudHJ5Lmljb25cbiAgKVxuICBjb25zdCB3aXNoZWQ6IFdpc2hlZEl0ZW0gPSB7XG4gICAgLi4ubWFsbEVudHJ5LFxuICAgIC4uLm1hbGxFbnRyeS5wcm9kdWN0LFxuICAgIHByaWNlLFxuICB9XG4gIHdpc2hsaXN0LnB1c2god2lzaGVkKVxuXG4gIHdpc2hsaXN0LnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCB0eXBlQ29tcGFyZSA9IGEudHlwZS5sb2NhbGVDb21wYXJlKGIudHlwZSlcbiAgICBpZiAodHlwZUNvbXBhcmUgIT09IDApIHJldHVybiB0eXBlQ29tcGFyZVxuXG4gICAgY29uc3QgYWJzdHJhY3RUeXBlQ29tcGFyZSA9IChhLmFic3RyYWN0VHlwZSA/PyBcIlwiKS5sb2NhbGVDb21wYXJlKFxuICAgICAgYi5hYnN0cmFjdFR5cGUgPz8gXCJcIlxuICAgIClcbiAgICBpZiAoYWJzdHJhY3RUeXBlQ29tcGFyZSAhPT0gMCkgcmV0dXJuIGFic3RyYWN0VHlwZUNvbXBhcmVcblxuICAgIGNvbnN0IHJhcml0eUNvbXBhcmUgPVxuICAgICAgT2JqZWN0LmtleXMoUmFyaXR5KS5pbmRleE9mKGEucmFyaXR5ID8/IFwiXCIpIC1cbiAgICAgIE9iamVjdC5rZXlzKFJhcml0eSkuaW5kZXhPZihiLnJhcml0eSA/PyBcIlwiKVxuICAgIGlmIChyYXJpdHlDb21wYXJlICE9PSAwKSByZXR1cm4gcmFyaXR5Q29tcGFyZVxuXG4gICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSlcbiAgfSlcblxuICBMb2NhbFN0b3JhZ2Uud2lzaGxpc3QgPSB3aXNobGlzdFxuXG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9mbGF2cl9ub3RpZi9pY29uX21lc3NhZ2UuaHRtbFwiKVxuICAkLmZsYXZyTm90aWYoXG4gICAgdGVtcGxhdGUucmVuZGVyKHtcbiAgICAgIC4uLndpc2hlZCxcbiAgICAgIG1lc3NhZ2U6IHRyYW5zbGF0ZS5tYXJrZXQuYWRkX3RvX3dpc2hsaXN0LmFkZGVkX3RvX3dpc2hsaXN0KFxuICAgICAgICB3aXNoZWQubmFtZSxcbiAgICAgICAgd2lzaGVkLnByaWNlXG4gICAgICApLFxuICAgIH0pXG4gIClcbiAgcmV0dXJuIHRydWVcbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIlxuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSBcIi4uL2kxOG4vdHJhbnNsYXRlXCJcbmltcG9ydCB7IExvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9sb2NhbF9zdG9yYWdlL2xvY2FsX3N0b3JhZ2VcIlxuaW1wb3J0IHR5cGUgeyBXaXNoZWRJdGVtIH0gZnJvbSBcIi4uL2xvY2FsX3N0b3JhZ2Uvd2lzaGVkX2l0ZW1cIlxuaW1wb3J0IHsgUmFyaXR5IH0gZnJvbSBcIi4uL21hcmtldHBsYWNlL2VudW1zL3Jhcml0eS5lbnVtXCJcbmltcG9ydCB0eXBlIHsgTWFya2V0RW50cnkgfSBmcm9tIFwiLi4vbWFya2V0cGxhY2UvaW50ZXJmYWNlcy9tYXJrZXRfZW50cnlcIlxuaW1wb3J0IHsgZ2V0SXRlbURldGFpbHMgfSBmcm9tIFwiLi4vbWFya2V0cGxhY2UvbWFya2V0cGxhY2VfaGFuZGxlcnNcIlxuXG5sZXQgbWFya2V0T2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXIgfCBudWxsXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkTWFya2V0KCk6IHZvaWQge1xuICBtYXJrZXRPYnNlcnZlcj8uZGlzY29ubmVjdCgpXG4gIG1hcmtldE9ic2VydmVyID0gbnVsbFxuXG4gIGlmIChsb2NhdGlvbi5wYXRobmFtZSAhPT0gXCIvbWFya2V0cGxhY2VcIikgcmV0dXJuXG5cbiAgLy8gYC5tYXJrZXRwbGFjZS1zZWFyY2gtaXRlbXNgIGlzIHRoZSBjb250YWluZXIgd2hvc2UgSFRNTCBjb250ZW50IGlzIGJlaW5nXG4gIC8vIHJlcGxhY2VkIG9uIGV2ZXJ5IGFjdGlvbi5cbiAgY29uc3Qgc2VhcmNoSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxVTGlzdEVsZW1lbnQ+KFxuICAgIFwiLm1hcmtldHBsYWNlLXNlYXJjaC1pdGVtc1wiXG4gIClcbiAgaWYgKCFzZWFyY2hJdGVtcykgcmV0dXJuXG5cbiAgbWFya2V0T2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihsb2FkV2lzaGxpc3QpXG4gIG1hcmtldE9ic2VydmVyLm9ic2VydmUoc2VhcmNoSXRlbXMsIHtcbiAgICBjaGlsZExpc3Q6IHRydWUsXG4gIH0pXG5cbiAgbG9hZFdpc2hsaXN0KClcbn1cblxuZnVuY3Rpb24gbG9hZFdpc2hsaXN0KCk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGxpIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTExJRWxlbWVudD4oXG4gICAgXCIubWFya2V0cGxhY2UtYWJzdHJhY3RcIlxuICApKSB7XG4gICAgbGkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+XG4gICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihcbiAgICAgICAgKF86IE11dGF0aW9uUmVjb3JkW10sIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyKTogdm9pZCA9PiB7XG4gICAgICAgICAgY29uc3QgbWFya2V0RW50cnkgPSBnZXRJdGVtRGV0YWlscyhsaSlcbiAgICAgICAgICBpZiAoIW1hcmtldEVudHJ5KSByZXR1cm5cblxuICAgICAgICAgIGFkZFdpc2hpc3RCdXR0b24obWFya2V0RW50cnksIG9ic2VydmVyKVxuICAgICAgICB9XG4gICAgICApLm9ic2VydmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYXJrZXRwbGFjZS16b29tXCIpIGFzIE5vZGUsIHtcbiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgfSlcbiAgICApXG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkV2lzaGlzdEJ1dHRvbihcbiAgbWFya2V0RW50cnk6IE1hcmtldEVudHJ5LFxuICBvYnNlcnZlcj86IE11dGF0aW9uT2JzZXJ2ZXJcbik6IHZvaWQge1xuICBjb25zdCBidXR0b25zQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgXCIjbWFya2V0cGxhY2UtaXRlbURldGFpbFwiXG4gIClcbiAgaWYgKCFidXR0b25zQ29udGFpbmVyKSByZXR1cm5cbiAgb2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKVxuICBoaWphY2tCdXlCdXR0b25zKG1hcmtldEVudHJ5KVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFya2V0cGxhY2UtaXRlbURldGFpbC1pbmZvLWF1dG9idXlcIik/LnJlbW92ZSgpXG4gIGNvbnN0IGJ1dHRvblRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9hdXRvX2J1eV9idXR0b24uaHRtbFwiKVxuICBidXR0b25zQ29udGFpbmVyLmluc2VydEFkamFjZW50SFRNTChcbiAgICBcImJlZm9yZWVuZFwiLFxuICAgIGJ1dHRvblRlbXBsYXRlLnJlbmRlcih7IHRyYW5zbGF0ZSB9KVxuICApXG5cbiAgYnV0dG9uc0NvbnRhaW5lclxuICAgIC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PihcIiNtYXJrZXRwbGFjZS1pdGVtRGV0YWlsLWluZm8tYXV0b2J1eVwiKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IGFkZFRvV2lzaGxpc3RGbGF2cihtYXJrZXRFbnRyeSkpXG59XG5cbmZ1bmN0aW9uIGFkZFRvV2lzaGxpc3RGbGF2cihtYXJrZXRFbnRyeTogTWFya2V0RW50cnkpOiB2b2lkIHtcbiAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2F1dG9fYnV5X2ZsYXZyLmh0bWxcIilcblxuICAkLmZsYXZyKHtcbiAgICBjb250ZW50OiB0ZW1wbGF0ZS5yZW5kZXIoeyB0cmFuc2xhdGUgfSksXG4gICAgYnV0dG9uczoge1xuICAgICAgY2xvc2U6IHsgc3R5bGU6IFwiY2xvc2VcIiB9LFxuICAgICAgc2F2ZToge1xuICAgICAgICBhY3Rpb246ICgpID0+IHNhdmUobWFya2V0RW50cnkpLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRpYWxvZzogXCJwcm9tcHRcIixcbiAgICBwcm9tcHQ6IHtcbiAgICAgIHZhbHVlOiBcIlwiLFxuICAgIH0sXG4gICAgb25CdWlsZDogJGNvbnRhaW5lciA9PiB7XG4gICAgICAkY29udGFpbmVyLmFkZENsYXNzKFwibmV3LWxheW91dC1wb3B1cFwiKVxuXG4gICAgICBkb2N1bWVudFxuICAgICAgICAucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PihcIi5mbGF2ci1wcm9tcHRcIilcbiAgICAgICAgPy5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgKHsga2V5IH0pID0+IHtcbiAgICAgICAgICBpZiAoa2V5ICE9PSBcIkVudGVyXCIpIHJldHVyblxuICAgICAgICAgIHNhdmUobWFya2V0RW50cnkpXG4gICAgICAgIH0pXG4gICAgfSxcbiAgfSlcbn1cblxuZnVuY3Rpb24gc2F2ZShtYXJrZXRFbnRyeTogTWFya2V0RW50cnkpOiBib29sZWFuIHtcbiAgY29uc3QgcHJpY2UgPSBOdW1iZXIoXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PihcIi5mbGF2ci1wcm9tcHRcIik/LnZhbHVlLnRyaW0oKVxuICApXG4gIGlmICghcHJpY2UgfHwgcHJpY2UgPD0gMCkge1xuICAgICQuZmxhdnJOb3RpZih0cmFuc2xhdGUubWFya2V0LmFkZF90b193aXNobGlzdC5pbnZhbGlkX3ByaWNlKVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3Qgd2lzaGxpc3QgPSBMb2NhbFN0b3JhZ2Uud2lzaGxpc3QuZmlsdGVyKFxuICAgIHdpc2hsaXN0RW50cnkgPT4gd2lzaGxpc3RFbnRyeS5pY29uICE9PSBtYXJrZXRFbnRyeS5pY29uXG4gIClcbiAgY29uc3Qgd2lzaGVkOiBXaXNoZWRJdGVtID0geyAuLi5tYXJrZXRFbnRyeSwgcHJpY2UgfVxuICB3aXNobGlzdC5wdXNoKHdpc2hlZClcblxuICB3aXNobGlzdC5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgdHlwZUNvbXBhcmUgPSBhLnR5cGUubG9jYWxlQ29tcGFyZShiLnR5cGUpXG4gICAgaWYgKHR5cGVDb21wYXJlICE9PSAwKSByZXR1cm4gdHlwZUNvbXBhcmVcblxuICAgIGNvbnN0IGFic3RyYWN0VHlwZUNvbXBhcmUgPSAoYS5hYnN0cmFjdFR5cGUgPz8gXCJcIikubG9jYWxlQ29tcGFyZShcbiAgICAgIGIuYWJzdHJhY3RUeXBlID8/IFwiXCJcbiAgICApXG4gICAgaWYgKGFic3RyYWN0VHlwZUNvbXBhcmUgIT09IDApIHJldHVybiBhYnN0cmFjdFR5cGVDb21wYXJlXG5cbiAgICBjb25zdCByYXJpdHlDb21wYXJlID1cbiAgICAgIE9iamVjdC5rZXlzKFJhcml0eSkuaW5kZXhPZihhLnJhcml0eSA/PyBcIlwiKSAtXG4gICAgICBPYmplY3Qua2V5cyhSYXJpdHkpLmluZGV4T2YoYi5yYXJpdHkgPz8gXCJcIilcbiAgICBpZiAocmFyaXR5Q29tcGFyZSAhPT0gMCkgcmV0dXJuIHJhcml0eUNvbXBhcmVcblxuICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpXG4gIH0pXG5cbiAgTG9jYWxTdG9yYWdlLndpc2hsaXN0ID0gd2lzaGxpc3RcblxuICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvZmxhdnJfbm90aWYvaWNvbl9tZXNzYWdlLmh0bWxcIilcbiAgJC5mbGF2ck5vdGlmKFxuICAgIHRlbXBsYXRlLnJlbmRlcih7XG4gICAgICAuLi53aXNoZWQsXG4gICAgICBtZXNzYWdlOiB0cmFuc2xhdGUubWFya2V0LmFkZF90b193aXNobGlzdC5hZGRlZF90b193aXNobGlzdChcbiAgICAgICAgd2lzaGVkLm5hbWUsXG4gICAgICAgIHdpc2hlZC5wcmljZVxuICAgICAgKSxcbiAgICB9KVxuICApXG4gIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIGhpamFja0J1eUJ1dHRvbnMobWFya2V0RW50cnk6IE1hcmtldEVudHJ5KTogdm9pZCB7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCIubWFya2V0cGxhY2UtaXRlbURldGFpbC1idXlcIilcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICBhZGRQdXJjaGFzZShtYXJrZXRFbnRyeSlcbiAgICB9KVxufVxuXG5mdW5jdGlvbiBhZGRQdXJjaGFzZShtYXJrZXRFbnRyeTogTWFya2V0RW50cnkpOiB2b2lkIHtcbiAgTG9jYWxTdG9yYWdlLnB1cmNoYXNlcyA9IFtcbiAgICBtYXJrZXRFbnRyeSxcbiAgICAuLi5Mb2NhbFN0b3JhZ2UucHVyY2hhc2VzLmZpbHRlcihcbiAgICAgIHB1cmNoYXNlID0+IHB1cmNoYXNlLml0ZW1pZCAhPT0gbWFya2V0RW50cnkuaXRlbWlkXG4gICAgKSxcbiAgXVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHR5cGUgeyBNYWluTWVudSB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy9tYWluX21lbnVcIlxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZE1lbnUoKTogdm9pZCB7XG4gIGNvbnN0IG1lbnVJbm5lclJpZ2h0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtZW51LWlubmVyLXJpZ2h0XCIpXG4gIGlmICghbWVudUlubmVyUmlnaHQgfHwgbWVudUlubmVyUmlnaHQucXVlcnlTZWxlY3RvcihcIi5tYWluLW1lbnUtZWVcIikpIHJldHVyblxuXG4gIC8vIFJlbW92ZSBiYW5rXG4gIG1lbnVJbm5lclJpZ2h0LnF1ZXJ5U2VsZWN0b3IoXCIubWFpbi1tZW51LWJhbmtcIik/LnJlbW92ZSgpXG5cbiAgLy8gQWRkIEZvcnVtXG4gIGNvbnN0IG1lbnVUZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvbWFpbl9tZW51Lmh0bWxcIilcbiAgY29uc3QgbWFpbk1lbnVGb3J1bTogTWFpbk1lbnUgPSB7XG4gICAgY2xhc3M6IFwiZm9ydW1cIixcbiAgICBocmVmOiBcIi9mb3J1bVwiLFxuICAgIHRleHQ6IHRyYW5zbGF0ZS5ob21lLmZvcnVtLFxuICB9XG5cbiAgbWVudUlubmVyUmlnaHQuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgbWVudVRlbXBsYXRlLnJlbmRlcihtYWluTWVudUZvcnVtKVxuICApXG59XG4iLCJpbXBvcnQgeyBsb2FkTWFya2VycyB9IGZyb20gXCIuLi9wZXQvZXhwbG9yYXRpb25cIlxuaW1wb3J0IHsgbG9hZEV4cGxvcmF0aW9uSGlzdG9yeSB9IGZyb20gXCIuLi9wZXQvZXhwbG9yYXRpb24taGlzdG9yeVwiXG5cbmxldCBwZXRPYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlciB8IG51bGxcblxuZnVuY3Rpb24gbG9hZEV4cGxvcmF0aW9ucygpOiB2b2lkIHtcbiAgcGV0T2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKVxuICBwZXRPYnNlcnZlciA9IG51bGxcblxuICAvKiogYC5wYWdlLW1haW4tY29udGFpbmVyYCBjaGFuZ2VzIGJhY2tncm91bmQgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmVnaW9uLiAqL1xuICBjb25zdCBtYWluQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXG4gICAgXCIucGFnZS1tYWluLWNvbnRhaW5lclwiXG4gIClcbiAgaWYgKCFtYWluQ29udGFpbmVyKSByZXR1cm5cblxuICBwZXRPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGxvYWRFeHBsb3JhdGlvbnMpXG4gIHBldE9ic2VydmVyLm9ic2VydmUobWFpbkNvbnRhaW5lciwge1xuICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gIH0pXG5cbiAgbG9hZE1hcmtlcnMoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZFBldCgpOiB2b2lkIHtcbiAgaWYgKGxvY2F0aW9uLnBhdGhuYW1lICE9PSBcIi9wZXRcIikgcmV0dXJuXG4gIGxvYWRFeHBsb3JhdGlvbnMoKVxuICBsb2FkRXhwbG9yYXRpb25IaXN0b3J5KClcbn1cbiIsImltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiaG9nYW4uanNcIlxuaW1wb3J0IHsgZG93bmxvYWRQcm9maWxlIH0gZnJvbSBcIi4uL2Rvd25sb2FkLWNhbnZhc1wiXG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHsgZXhwb3J0T3V0Zml0IH0gZnJvbSBcIi4uL291dGZpdFwiXG5pbXBvcnQgdHlwZSB7IFByb2ZpbGVDb250YWN0QWN0aW9uIH0gZnJvbSBcIi4uL3RlbXBsYXRlcy9pbnRlcmZhY2VzL3Byb2ZpbGVfY29udGFjdF9hY3Rpb25cIlxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZFByb2ZpbGUoKTogdm9pZCB7XG4gIGNvbnN0IHByb2ZpbGVDb250YWN0QWN0aW9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgIFwicHJvZmlsZS1jb250YWN0LWFjdGlvbnNcIlxuICApXG4gIGlmIChcbiAgICAhcHJvZmlsZUNvbnRhY3RBY3Rpb25zIHx8XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5wcm9maWxlLWNvbnRhY3QtYWN0aW9uLWVlXCIpXG4gICkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL3Byb2ZpbGVfY29udGFjdF9hY3Rpb24uaHRtbFwiKVxuXG4gIGNvbnN0IHByb2ZpbGVBY3Rpb25FeHBvcnQ6IFByb2ZpbGVDb250YWN0QWN0aW9uID0ge1xuICAgIGlkOiBcInByb2ZpbGUtY29udGFjdC1hY3Rpb24tZXhwb3J0XCIsXG4gICAgYWN0aW9uRGVzY3JpcHRpb246IHRyYW5zbGF0ZS5wcm9maWxlLmV4cG9ydF9vdXRmaXQsXG4gIH1cbiAgY29uc3QgcHJvZmlsZUFjdGlvbkRvd25sb2FkOiBQcm9maWxlQ29udGFjdEFjdGlvbiA9IHtcbiAgICBpZDogXCJwcm9maWxlLWNvbnRhY3QtYWN0aW9uLWRvd25sb2FkXCIsXG4gICAgYWN0aW9uRGVzY3JpcHRpb246IHRyYW5zbGF0ZS5wcm9maWxlLmRvd25sb2FkX291dGZpdCxcbiAgfVxuXG4gIC8vIEFkZCBlbnRyaWVzXG4gIHByb2ZpbGVDb250YWN0QWN0aW9ucy5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgXCJiZWZvcmVlbmRcIixcbiAgICB0ZW1wbGF0ZS5yZW5kZXIocHJvZmlsZUFjdGlvbkV4cG9ydClcbiAgKVxuICBwcm9maWxlQ29udGFjdEFjdGlvbnMuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgdGVtcGxhdGUucmVuZGVyKHByb2ZpbGVBY3Rpb25Eb3dubG9hZClcbiAgKVxuXG4gIC8vIEFkZCBjbGljayBldmVudHNcbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQocHJvZmlsZUFjdGlvbkV4cG9ydC5pZClcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBleHBvcnRQcm9maWxlKVxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChwcm9maWxlQWN0aW9uRG93bmxvYWQuaWQpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZG93bmxvYWRQcm9maWxlKVxufVxuXG5mdW5jdGlvbiBleHBvcnRQcm9maWxlKCk6IHZvaWQge1xuICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEhlYWRpbmdFbGVtZW50PihcbiAgICBcIiNtYWluLXNlY3Rpb24gLnNlY3Rpb24tdGl0bGVcIlxuICApXG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKFNhY2hhLkF2YXRhci5hdmF0YXJzKS5maWx0ZXIoa2V5ID0+XG4gICAga2V5LnN0YXJ0c1dpdGgoXCIjcGxheWVyUHJvZmlsZUF2YXRhclwiKVxuICApXG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGV4cG9ydE91dGZpdChrZXksIHRpdGxlPy50ZXh0Q29udGVudD8udHJpbSgpKVxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IFB1cnJvc2hvcFN0YXR1cyB9IGZyb20gXCIuLi9hcGkvbWV0YVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcblxuLyoqIFNob3dzIGEgUHVycm8nU2hvcCBidXR0b24gaW4gdGhlIG1haW4gbWVudSB3aGVuIGl0J3MgYXZhaWxhYmxlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRQdXJyb1Nob3AoKTogdm9pZCB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubWFpbi1tZW51LXB1cnJvc2hvcFwiKT8ucmVtb3ZlKClcblxuICAvLyBBIGJ1ZyBpbiBXZWJQYWNrIHByZXZlbnRzIHVzaW5nIGBMb2NhbFN0b3JhZ2UubWV0YT8ucHVycm9zaG9wLnN0YXR1c2AuXG4gIGlmIChcbiAgICBMb2NhbFN0b3JhZ2UubWV0YSA9PT0gbnVsbCB8fFxuICAgIExvY2FsU3RvcmFnZS5tZXRhLnB1cnJvc2hvcC5zdGF0dXMgIT09IFB1cnJvc2hvcFN0YXR1cy5lbmFibGVkXG4gIClcbiAgICByZXR1cm5cblxuICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvbWFpbl9tZW51X3B1cnJvc2hvcC5odG1sXCIpXG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKFwibWVudS1pbm5lci1sZWZ0XCIpXG4gICAgPy5pbnNlcnRBZGphY2VudEhUTUwoXCJhZnRlcmJlZ2luXCIsIHRlbXBsYXRlLnJlbmRlcih7fSkpXG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IGdldE5hbWUgfSBmcm9tIFwiLi4vZG93bmxvYWQtY2FudmFzXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB0eXBlIHsgU2V0dGluZ3MgfSBmcm9tIFwiLi4vdGVtcGxhdGVzL2ludGVyZmFjZXMvc2V0dGluZ3NcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhY2NvdW50UmlnaHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FjY291bnQtcmlnaHQgZGl2XCIpXG4gIGlmICghYWNjb3VudFJpZ2h0IHx8IGFjY291bnRSaWdodC5xdWVyeVNlbGVjdG9yKFwiLmFjY291bnQtZWUtYmxvY1wiKSkgcmV0dXJuXG5cbiAgY29uc3Qgc2V0dGluZ3NUZW1wbGF0ZTogVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2h0bWwvc2V0dGluZ3MuaHRtbFwiKVxuXG4gIGFjY291bnRSaWdodC5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgXCJiZWZvcmVlbmRcIixcbiAgICBzZXR0aW5nc1RlbXBsYXRlLnJlbmRlcih7XG4gICAgICAuLi4oYXdhaXQgTG9jYWxTdG9yYWdlLmdldFNldHRpbmdzKCkpLFxuICAgICAgdHJhbnNsYXRlLFxuICAgIH0pXG4gIClcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVlLWRlYnVnLWVuYWJsZWRcIik/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgTG9jYWxTdG9yYWdlLmRlYnVnID0gIUxvY2FsU3RvcmFnZS5kZWJ1Z1xuICAgIHJlbG9hZFNldHRpbmdzKClcbiAgfSlcblxuICBpZiAoTG9jYWxTdG9yYWdlLnVubG9ja2VkKSB7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZChcImVlLW1pbmlnYW1lcy1lbmFibGVkXCIpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIExvY2FsU3RvcmFnZS5taW5pZ2FtZXMgPSAhTG9jYWxTdG9yYWdlLm1pbmlnYW1lc1xuICAgICAgICByZWxvYWRTZXR0aW5ncygpXG4gICAgICB9KVxuXG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZChcImVlLWV4cGxvcmF0aW9ucy1lbmFibGVkXCIpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIExvY2FsU3RvcmFnZS5leHBsb3JhdGlvbnMgPSAhTG9jYWxTdG9yYWdlLmV4cGxvcmF0aW9uc1xuICAgICAgICByZWxvYWRTZXR0aW5ncygpXG4gICAgICB9KVxuXG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZChcImVlLW1hcmtldC1lbmFibGVkXCIpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIExvY2FsU3RvcmFnZS5tYXJrZXQgPSAhTG9jYWxTdG9yYWdlLm1hcmtldFxuICAgICAgICByZWxvYWRTZXR0aW5ncygpXG4gICAgICB9KVxuICB9XG5cbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoXCJlZS1pbXBvcnRcIilcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBpbXBvcnRTZXR0aW5ncylcblxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChcImVlLWV4cG9ydFwiKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHZvaWQgZXhwb3J0U2V0dGluZ3MoKSlcbn1cblxuZnVuY3Rpb24gcmVsb2FkU2V0dGluZ3MoKTogdm9pZCB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KFwiLmFjY291bnQtZWUtYmxvY1wiKT8ucmVtb3ZlKClcbiAgdm9pZCBsb2FkU2V0dGluZ3MoKVxufVxuXG5mdW5jdGlvbiBpbXBvcnRTZXR0aW5ncygpOiB2b2lkIHtcbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIilcbiAgaW5wdXQuc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcImZpbGVcIilcbiAgaW5wdXQuc2V0QXR0cmlidXRlKFwiYWNjZXB0XCIsIFwiYXBwbGljYXRpb24vanNvblwiKVxuICBpbnB1dC5jbGljaygpXG5cbiAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGV2ZW50ID0+IHtcbiAgICBpZiAoIWV2ZW50LnRhcmdldCkgcmV0dXJuXG4gICAgY29uc3QgZmlsZXMgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZpbGVzXG4gICAgaWYgKCFmaWxlcykgcmV0dXJuXG4gICAgY29uc3QgZmlsZSA9IGZpbGVzWzBdXG4gICAgaWYgKCFmaWxlKSByZXR1cm5cbiAgICB2b2lkIGZpbGUudGV4dCgpLnRoZW4oYXN5bmMgdmFsdWUgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHBhcnNlZDogU2V0dGluZ3MgPSBKU09OLnBhcnNlKHZhbHVlKVxuICAgICAgYXdhaXQgTG9jYWxTdG9yYWdlLnNldFNldHRpbmdzKHBhcnNlZClcblxuICAgICAgcmVsb2FkU2V0dGluZ3MoKVxuICAgICAgJC5mbGF2ck5vdGlmKHRyYW5zbGF0ZS5hY2NvdW50LmltcG9ydGVkKVxuICAgIH0pXG4gIH0pXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4cG9ydFNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBocmVmID1cbiAgICBcImRhdGE6dGV4dC9qc29uO2NoYXJzZXQ9dXRmLTgsXCIgK1xuICAgIGVuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIEpTT04uc3RyaW5naWZ5KGF3YWl0IExvY2FsU3RvcmFnZS5nZXRTZXR0aW5ncygpLCBudWxsLCAyKVxuICAgIClcblxuICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIilcbiAgYS5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGhyZWYpXG4gIGEuc2V0QXR0cmlidXRlKFxuICAgIFwiZG93bmxvYWRcIixcbiAgICBgJHtnZXROYW1lKCkgPz8gXCJlbGRhcnlhLWVuaGFuY2VtZW50c1wifS1zZXR0aW5ncy5qc29uYFxuICApXG4gIGEuY2xpY2soKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZSB9IGZyb20gXCJob2dhbi5qc1wiXG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGVcIlxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlIH0gZnJvbSBcIi4uL2xvY2FsX3N0b3JhZ2UvbG9jYWxfc3RvcmFnZVwiXG5pbXBvcnQgeyBTZXNzaW9uU3RvcmFnZSB9IGZyb20gXCIuLi9zZXNzaW9uX3N0b3JhZ2Uvc2Vzc2lvbl9zdG9yYWdlXCJcbmltcG9ydCB7IHRvZ2dsZVRha2VvdmVyIH0gZnJvbSBcIi4uL3Rha2VvdmVyL2JyYWluXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRUb3BCYXIoKTogdm9pZCB7XG4gIGNvbnN0IGhlYWRlclJpZ2h0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJoZWFkZXItcmlnaHRcIilcbiAgaWYgKCFoZWFkZXJSaWdodCkgcmV0dXJuXG5cbiAgY29uc3QgaGVhZGVyVGFrZW92ZXIgPSBoZWFkZXJSaWdodC5xdWVyeVNlbGVjdG9yKFwiI2hlYWRlci10YWtlb3ZlclwiKVxuICBpZiAoaGVhZGVyVGFrZW92ZXIpIGhlYWRlclRha2VvdmVyLnJlbW92ZSgpXG4gIGVsc2UgbG9hZExpbmtzKClcblxuICBpZiAoXG4gICAgKExvY2FsU3RvcmFnZS5taW5pZ2FtZXMgfHxcbiAgICAgIExvY2FsU3RvcmFnZS5leHBsb3JhdGlvbnMgfHxcbiAgICAgIExvY2FsU3RvcmFnZS5tYXJrZXQpICYmXG4gICAgTG9jYWxTdG9yYWdlLnVubG9ja2VkXG4gICkge1xuICAgIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9oZWFkZXJfdGFrZW92ZXIuaHRtbFwiKVxuICAgIGhlYWRlclJpZ2h0Lmluc2VydEFkamFjZW50SFRNTChcbiAgICAgIFwiYWZ0ZXJiZWdpblwiLFxuICAgICAgdGVtcGxhdGUucmVuZGVyKHsgdGFrZW92ZXI6IFNlc3Npb25TdG9yYWdlLnRha2VvdmVyLCB0cmFuc2xhdGUgfSlcbiAgICApXG5cbiAgICBoZWFkZXJSaWdodFxuICAgICAgLnF1ZXJ5U2VsZWN0b3IoXCIjaGVhZGVyLXRha2VvdmVyXCIpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0b2dnbGVUYWtlb3ZlcilcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2FkTGlua3MoKTogdm9pZCB7XG4gIGNvbnN0IGhlYWRlclByb2ZpbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImhlYWRlci1wcm9maWxlXCIpPy5maXJzdENoaWxkXG4gIGlmIChoZWFkZXJQcm9maWxlPy50ZXh0Q29udGVudCkge1xuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKVxuICAgIGEuaHJlZiA9IFwiL3BsYXllci9wcm9maWxlXCJcbiAgICBhLnN0eWxlLmNvbG9yID0gXCJ2YXIoLS10ZXh0LWNvbG9yKVwiXG4gICAgYS5zdHlsZS5mb250RmFtaWx5ID0gJ1wiQWxlZ3JleWEgU2Fuc1wiLCBzYW5zLXNlcmlmJ1xuICAgIGEuc3R5bGUuZm9udFdlaWdodCA9IFwidW5zZXRcIlxuICAgIGEudGV4dENvbnRlbnQgPSBoZWFkZXJQcm9maWxlLnRleHRDb250ZW50LnRyaW0oKVxuXG4gICAgY29uc3QgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpXG4gICAgcC5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJiZWZvcmVlbmRcIiwgYSlcblxuICAgIGhlYWRlclByb2ZpbGUucmVwbGFjZVdpdGgocClcbiAgfVxuXG4gIGNvbnN0IGF2YXRhclRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhdmF0YXItbWVudS1jb250YWluZXItb3V0ZXI+cFwiKVxuICBpZiAoYXZhdGFyVGl0bGU/LnRleHRDb250ZW50KVxuICAgIGF2YXRhclRpdGxlLmlubmVySFRNTCA9IGA8YSBocmVmPVwiL3BsYXllci9wcm9maWxlXCIgc3R5bGU9XCJjb2xvcjogI0ZGRkZGRjsgZm9udC1zaXplOiAyM3B4OyBmb250LXdlaWdodDogOTAwOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1wiPiR7YXZhdGFyVGl0bGUudGV4dENvbnRlbnQudHJpbSgpfTwvYT5gXG5cbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIiNhdmF0YXItbWVudS1jb250YWluZXI+Y2FudmFzXCIpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4gcGFnZUxvYWQoXCIvcGxheWVyL2FwcGVhcmFuY2VcIikpXG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcImhvZ2FuLmpzXCJcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0ZVwiXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vbG9jYWxfc3RvcmFnZS9sb2NhbF9zdG9yYWdlXCJcbmltcG9ydCB0eXBlIHsgV2lzaGxpc3RTZXR0aW5ncyB9IGZyb20gXCIuLi90ZW1wbGF0ZXMvaW50ZXJmYWNlcy93aXNobGlzdF9zZXR0aW5nc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkV2lzaGxpc3QoKTogdm9pZCB7XG4gIGNvbnN0IG1hcmtldHBsYWNlTWVudSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFya2V0cGxhY2UtbWVudVwiKVxuICBpZiAoIW1hcmtldHBsYWNlTWVudSkgcmV0dXJuXG5cbiAgaWYgKCFtYXJrZXRwbGFjZU1lbnUucXVlcnlTZWxlY3RvcihcIiN3aXNobGlzdC1idXR0b25cIikpIHtcbiAgICBmb3IgKGNvbnN0IGEgb2YgbWFya2V0cGxhY2VNZW51LnF1ZXJ5U2VsZWN0b3JBbGwoXCJhXCIpKSB7XG4gICAgICBhLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PlxuICAgICAgICBwYWdlTG9hZChhLmhyZWYsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgbWFya2V0cGxhY2VNZW51LnF1ZXJ5U2VsZWN0b3IoXCIjd2lzaGxpc3QtYnV0dG9uXCIpPy5yZW1vdmUoKVxuICBjb25zdCB3aXNobGlzdEJ1dHRvblRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC93aXNobGlzdF9idXR0b24uaHRtbFwiKVxuICBtYXJrZXRwbGFjZU1lbnUuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgIFwiYmVmb3JlZW5kXCIsXG4gICAgd2lzaGxpc3RCdXR0b25UZW1wbGF0ZS5yZW5kZXIoeyB0cmFuc2xhdGUgfSlcbiAgKVxuXG4gIGNvbnN0IHdpc2hsaXN0QnV0dG9uID1cbiAgICBtYXJrZXRwbGFjZU1lbnUucXVlcnlTZWxlY3RvcjxIVE1MQW5jaG9yRWxlbWVudD4oXCIjd2lzaGxpc3QtYnV0dG9uXCIpXG4gIHdpc2hsaXN0QnV0dG9uPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT5cbiAgICBpbnNlcnRXaXNobGlzdCh3aXNobGlzdEJ1dHRvbilcbiAgKVxufVxuXG5mdW5jdGlvbiBpbnNlcnRXaXNobGlzdChidXR0b246IEhUTUxBbmNob3JFbGVtZW50KTogdm9pZCB7XG4gIC8vIEFzc2lzdGFuY2VcbiAgY29uc3QgYXNzaXN0YW5jZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubWFya2V0cGxhY2UtYXNzaXN0YW5jZVwiKVxuICBpZiAoYXNzaXN0YW5jZSkgYXNzaXN0YW5jZS5pbm5lckhUTUwgPSB0cmFuc2xhdGUubWFya2V0Lndpc2hsaXN0LmFzc2lzdGFuY2VcblxuICAvLyBNZW51XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCIjbWFya2V0cGxhY2UtbWVudSAuYWN0aXZlXCIpXG4gICAgPy5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpXG4gIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpXG5cbiAgLy8gRmlsdGVyc1xuICBjb25zdCBmaWx0ZXJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYXJrZXRwbGFjZS1maWx0ZXJzXCIpXG4gIGlmIChmaWx0ZXJzKSBmaWx0ZXJzLmlubmVySFRNTCA9IFwiXCJcblxuICAvLyBDb250ZW50XG4gIGNvbnN0IHdpc2hsaXN0VGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL3dpc2hsaXN0X3NldHRpbmdzLmh0bWxcIilcbiAgY29uc3QgY29udGFpbmVyID1cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLm1hcmtldHBsYWNlLWNvbnRhaW5lclwiKSA/P1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFya2V0cGxhY2UtYWN0aXZlLWF1Y3Rpb25zXCIpID8/XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYXJrZXRwbGFjZS1pdGVtc0ZvclNhbGVcIilcbiAgaWYgKCFjb250YWluZXIpIHJldHVyblxuXG4gIGNvbnN0IHdpc2hsaXN0Q29udGV4dDogV2lzaGxpc3RTZXR0aW5ncyA9IHtcbiAgICB3aXNobGlzdDogTG9jYWxTdG9yYWdlLndpc2hsaXN0LFxuICB9XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSB3aXNobGlzdFRlbXBsYXRlLnJlbmRlcih7XG4gICAgLi4ud2lzaGxpc3RDb250ZXh0LFxuICAgIHRyYW5zbGF0ZSxcbiAgfSlcblxuICAvLyBCdXR0b25zXG4gIGZvciAoY29uc3QgdHIgb2YgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0clwiKSkge1xuICAgIGNvbnN0IGljb24gPSB0ci5kYXRhc2V0Lmljb25cbiAgICBpZiAoIWljb24pIGNvbnRpbnVlXG5cbiAgICAvLyBSZXNldCBzdGF0dXNcbiAgICBjb25zdCByZXNldCA9IHRyLnF1ZXJ5U2VsZWN0b3IoXCIucmVzZXQtaXRlbS1zdGF0dXNcIilcbiAgICBpZiAocmVzZXQpXG4gICAgICByZXNldC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICByZXNldFN0YXR1cyhpY29uKVxuICAgICAgICBpbnNlcnRXaXNobGlzdChidXR0b24pXG4gICAgICB9KVxuXG4gICAgLy8gRGVsZXRlIGl0ZW0gZnJvbSB3aXNobGlzdFxuICAgIGNvbnN0IGRlbGV0ZUJ1dHRvbiA9IHRyLnF1ZXJ5U2VsZWN0b3IoXCIuZGVsZXRlLXdpc2hsaXN0LWl0ZW1cIilcbiAgICBpZiAoZGVsZXRlQnV0dG9uKVxuICAgICAgZGVsZXRlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIGRlbGV0ZUl0ZW0oaWNvbilcbiAgICAgICAgaW5zZXJ0V2lzaGxpc3QoYnV0dG9uKVxuICAgICAgfSlcblxuICAgIC8vIENoYW5nZSBwcmljZVxuICAgIGNvbnN0IGVkaXRQcmljZSA9IHRyLnF1ZXJ5U2VsZWN0b3IoXCIuZWRpdC1wcmljZVwiKVxuICAgIGlmIChlZGl0UHJpY2UpXG4gICAgICBlZGl0UHJpY2UuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAoKSA9PiB2b2lkIGNoYW5nZVByaWNlKGljb24pLnRoZW4oKCkgPT4gaW5zZXJ0V2lzaGxpc3QoYnV0dG9uKSlcbiAgICAgIClcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldFN0YXR1cyhpY29uOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgd2lzaGxpc3QgPSBMb2NhbFN0b3JhZ2Uud2lzaGxpc3RcbiAgY29uc3QgaW5kZXggPSB3aXNobGlzdC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLmljb24gPT09IGljb24pXG4gIGNvbnN0IGVudHJ5ID0gd2lzaGxpc3RbaW5kZXhdXG4gIGlmICghZW50cnkpIHJldHVyblxuXG4gIGRlbGV0ZSBlbnRyeS5lcnJvclxuICBMb2NhbFN0b3JhZ2Uud2lzaGxpc3QgPSBbXG4gICAgLi4ud2lzaGxpc3Quc2xpY2UodW5kZWZpbmVkLCBpbmRleCksXG4gICAgZW50cnksXG4gICAgLi4ud2lzaGxpc3Quc2xpY2UoaW5kZXggKyAxLCB1bmRlZmluZWQpLFxuICBdXG59XG5cbmZ1bmN0aW9uIGRlbGV0ZUl0ZW0oaWNvbjogc3RyaW5nKTogdm9pZCB7XG4gIExvY2FsU3RvcmFnZS53aXNobGlzdCA9IExvY2FsU3RvcmFnZS53aXNobGlzdC5maWx0ZXIoXG4gICAgaXRlbSA9PiBpdGVtLmljb24gIT09IGljb25cbiAgKVxufVxuXG5hc3luYyBmdW5jdGlvbiBjaGFuZ2VQcmljZShpY29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlID0gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9odG1sL2NoYW5nZV9wcmljZV9mbGF2ci5odG1sXCIpXG5cbiAgY29uc3Qgd2lzaGxpc3QgPSBMb2NhbFN0b3JhZ2Uud2lzaGxpc3RcbiAgY29uc3QgaW5kZXggPSB3aXNobGlzdC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLmljb24gPT09IGljb24pXG4gIGNvbnN0IGVudHJ5ID0gd2lzaGxpc3RbaW5kZXhdXG4gIGlmICghZW50cnkpIHJldHVyblxuXG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAkLmZsYXZyKHtcbiAgICAgIGNvbnRlbnQ6IHRlbXBsYXRlLnJlbmRlcih7IHRyYW5zbGF0ZSB9KSxcbiAgICAgIGRpYWxvZzogXCJwcm9tcHRcIixcbiAgICAgIHByb21wdDoge1xuICAgICAgICB2YWx1ZTogZW50cnkucHJpY2UudG9TdHJpbmcoKSxcbiAgICAgIH0sXG4gICAgICBidXR0b25zOiB7XG4gICAgICAgIGNsb3NlOiB7XG4gICAgICAgICAgc3R5bGU6IFwiY2xvc2VcIixcbiAgICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzYXZlOiB7XG4gICAgICAgICAgYWN0aW9uOiAoKSA9PiBzYXZlKGljb24sIHJlc29sdmUpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG9uQnVpbGQ6ICRjb250YWluZXIgPT4ge1xuICAgICAgICAkY29udGFpbmVyLmFkZENsYXNzKFwibmV3LWxheW91dC1wb3B1cFwiKVxuXG4gICAgICAgIGRvY3VtZW50XG4gICAgICAgICAgLnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oXCIuZmxhdnItcHJvbXB0XCIpXG4gICAgICAgICAgPy5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgKHsga2V5IH0pID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09IFwiRW50ZXJcIikgcmV0dXJuXG4gICAgICAgICAgICBzYXZlKGljb24sIHJlc29sdmUpXG4gICAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgfSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gc2F2ZShpY29uOiBzdHJpbmcsIHJlc29sdmU6ICgpID0+IHZvaWQpOiBib29sZWFuIHtcbiAgY29uc3Qgd2lzaGxpc3QgPSBMb2NhbFN0b3JhZ2Uud2lzaGxpc3RcbiAgY29uc3QgaW5kZXggPSB3aXNobGlzdC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLmljb24gPT09IGljb24pXG4gIGNvbnN0IGVudHJ5ID0gd2lzaGxpc3RbaW5kZXhdXG4gIGlmICghZW50cnkpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IHByaWNlID0gTnVtYmVyKFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oXCIuZmxhdnItcHJvbXB0XCIpPy52YWx1ZS50cmltKClcbiAgKVxuICBpZiAoIXByaWNlIHx8IHByaWNlIDw9IDApIHtcbiAgICAkLmZsYXZyTm90aWYodHJhbnNsYXRlLm1hcmtldC5jaGFuZ2VfcHJpY2UuaW52YWxpZF9wcmljZSlcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGVudHJ5LnByaWNlID0gcHJpY2VcbiAgTG9jYWxTdG9yYWdlLndpc2hsaXN0ID0gW1xuICAgIC4uLndpc2hsaXN0LnNsaWNlKHVuZGVmaW5lZCwgaW5kZXgpLFxuICAgIGVudHJ5LFxuICAgIC4uLndpc2hsaXN0LnNsaWNlKGluZGV4ICsgMSwgdW5kZWZpbmVkKSxcbiAgXVxuXG4gIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaHRtbC9mbGF2cl9ub3RpZi9pY29uX21lc3NhZ2UuaHRtbFwiKVxuICAkLmZsYXZyTm90aWYoXG4gICAgdGVtcGxhdGUucmVuZGVyKHtcbiAgICAgIC4uLmVudHJ5LFxuICAgICAgbWVzc2FnZTogdHJhbnNsYXRlLm1hcmtldC5jaGFuZ2VfcHJpY2UuY2hhbmdlZF9wcmljZShcbiAgICAgICAgZW50cnkubmFtZSxcbiAgICAgICAgZW50cnkucHJpY2VcbiAgICAgICksXG4gICAgfSlcbiAgKVxuXG4gIHJlc29sdmUoKVxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCB7IGxvYWREcmVzc2luZ0V4cGVyaWVuY2UgfSBmcm9tIFwiLi9hcHBlYXJhbmNlL2RyZXNzaW5nX2V4cGVyaWVuY2VcIlxuaW1wb3J0IHsgbG9hZENoZWF0Q29kZXMgfSBmcm9tIFwiLi9jaGVhdF9jb2Rlc1wiXG5pbXBvcnQgeyBtaWdyYXRlIH0gZnJvbSBcIi4vbWlncmF0ZVwiXG5pbXBvcnQgeyBsb2FkVGFrZW92ZXIgfSBmcm9tIFwiLi90YWtlb3Zlci9icmFpblwiXG5pbXBvcnQgeyBsb2FkQXVjdGlvbnMgfSBmcm9tIFwiLi91aS9hdWN0aW9uc1wiXG5pbXBvcnQgeyBsb2FkQ2Fyb3VzZWwgfSBmcm9tIFwiLi91aS9jYXJvdXNlbFwiXG5pbXBvcnQgeyBsb2FkRmF2b3VyaXRlcyB9IGZyb20gXCIuL3VpL2Zhdm91cml0ZXNcIlxuaW1wb3J0IHsgbG9hZEhvbWVDb250ZW50IH0gZnJvbSBcIi4vdWkvaG9tZV9jb250ZW50XCJcbmltcG9ydCB7IGxvYWRNYWxsIH0gZnJvbSBcIi4vdWkvbWFsbFwiXG5pbXBvcnQgeyBsb2FkTWFya2V0IH0gZnJvbSBcIi4vdWkvbWFya2V0XCJcbmltcG9ydCB7IGxvYWRNZW51IH0gZnJvbSBcIi4vdWkvbWVudVwiXG5pbXBvcnQgeyBsb2FkUGV0IH0gZnJvbSBcIi4vdWkvcGV0XCJcbmltcG9ydCB7IGxvYWRQcm9maWxlIH0gZnJvbSBcIi4vdWkvcHJvZmlsZVwiXG5pbXBvcnQgeyBsb2FkUHVycm9TaG9wIH0gZnJvbSBcIi4vdWkvcHVycm9fc2hvcFwiXG5pbXBvcnQgeyBsb2FkU2V0dGluZ3MgfSBmcm9tIFwiLi91aS9zZXR0aW5nc1wiXG5pbXBvcnQgeyBsb2FkVG9wQmFyIH0gZnJvbSBcIi4vdWkvdG9wX2JhclwiXG5pbXBvcnQgeyBsb2FkV2lzaGxpc3QgfSBmcm9tIFwiLi91aS93aXNobGlzdFwiXG5cbi8vIGxvYWRKUyhcImh0dHBzOi8vdW5wa2cuY29tL2hvZ2FuLmpzL2Rpc3QvdGVtcGxhdGUtMy4wLjIubWluLmpzXCIsIHRydWUpO1xuXG5mdW5jdGlvbiBsb2FkKCk6IHZvaWQge1xuICBsb2FkVUkoKVxuICBsb2FkVGFrZW92ZXIoKVxufVxuXG5mdW5jdGlvbiBsb2FkVUkoKTogdm9pZCB7XG4gIGxvYWRNZW51KClcbiAgbG9hZENhcm91c2VsKClcbiAgbG9hZEhvbWVDb250ZW50KClcbiAgbG9hZEZhdm91cml0ZXMoKVxuICBsb2FkUHJvZmlsZSgpXG4gIGxvYWRQZXQoKVxuICBsb2FkTWFya2V0KClcbiAgbG9hZFdpc2hsaXN0KClcbiAgbG9hZFRvcEJhcigpXG4gIGxvYWRBdWN0aW9ucygpXG4gIGxvYWRQdXJyb1Nob3AoKVxuICBsb2FkTWFsbCgpXG4gIGxvYWRDaGVhdENvZGVzKClcblxuICAvLyBFbGRhcnlhIGlzIGNyYXNoaW5nIHdoZW4gb3BlbmluZyBncm91cHMuXG4gIC8vIFRPRE86IEhhbmRsZSBlcnJvcnMgYW5kIHN0b3AgdGhlIGxvYWRpbmcgcHJvY2Vzcy5cbiAgdm9pZCBsb2FkRHJlc3NpbmdFeHBlcmllbmNlKClcblxuICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiKSB2b2lkIGxvYWRJbmRleGVkRGIoKVxuICBlbHNlIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCAoKSA9PiBsb2FkSW5kZXhlZERiKCkpXG59XG5cbmZ1bmN0aW9uIGxvYWRJbmRleGVkRGIoKTogdm9pZCB7XG4gIHZvaWQgbG9hZFNldHRpbmdzKClcbn1cblxubmV3IE11dGF0aW9uT2JzZXJ2ZXIobG9hZCkub2JzZXJ2ZShcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb250YWluZXJcIikgYXMgTm9kZSxcbiAge1xuICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgfVxuKVxuXG5taWdyYXRlKClcblxubG9hZFVJKClcbmNvbnNvbGUubG9nKGAke0dNLmluZm8uc2NyaXB0Lm5hbWV9IHYke0dNLmluZm8uc2NyaXB0LnZlcnNpb259IGxvYWRlZC5gKVxubG9hZFRha2VvdmVyKClcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==